la gestión de la memory de la syntax literal

  1. hay tres modos para crear una variable de matriz:

    • NSArray *array = @[@0, @1];

    • NSArray *array = [NSArray arrayWithObjects:@0, @1, nil];

    • NSArray *array = [[NSArray alloc] initWithObjects:@0, @1, nil];

  2. Cuando uso el segundo modo para crear, el varialbe "array" se lanzará a autoreleasepool; Cuando uso el tercero, retainCount de var será 1 pero no se lanzará a autoreleasepool; Quiero saber que el primer modo tiene el mismo efecto con el segundo modo o el tercer modo;

La regla general es que si no invocaste un método que comience por "asignar" o "nuevo" o que contenga "copyr", entonces no eres el propietario del object y no tienes el derecho ni la responsabilidad de liberarlo. Aunque, por supuesto, si retiene explícitamente un object, entonces tiene que equilibrarlo con un lanzamiento (o autorelease, que es simplemente otra forma de organizar para lanzarlo).

No intente razonar sobre qué objects pueden o no estar en el grupo de autorelease. Además, no trate de razonar sobre retener counts. Solo se preocupe por los derechos y responsabilidades de propiedad.

El resultado del primer y segundo modo es idéntico. El primer modo es una syntax de conveniencia del segundo

Fuente: Objective-C Literals

Siempre considere la count de retener como un delta. Asi que:

 1. NSArray *array = @[@0, @1]; 

array tiene un recuento de retener +0 (que ha retenido y, luego, la creación autorelease en la creación es en gran parte irrelevante y, de hecho, es posible que no se haya retenido y se haya autoelevado en absoluto; NSString *foo = @"foo"; tiene exactamente el mismo +0 semántica, pero los detalles de implementación no son una retención / autorelease).

 2. NSArray *array = [NSArray arrayWithObjects:@0, @1, nil]; 

Lo mismo que (1), solo con más ejercicio con los dedos.

 NSArray *array = [[NSArray alloc] initWithObjects:@0, @1, nil]; 

array tiene un contador de retener +1 en lo que a usted respecta. El único detalle que necesita saber es que para que las responsabilidades de su código para la array sean abandonadas, ese object debe ser release autorelease d. Ya sea que se haya creado con un recuento de retener +1 … ya sea que tenga un recuento de retención interno de 42 … si se retuvo 5 veces y si se retira automáticamente 4 … todas son totalmente irrelevantes para su código.

Además de los detalles de la asignación de memory, hay una gran diferencia entre

 NSArray* array = @[obj1, obj2, obj3]; 

y

 NSArray* array = [NSArray arrayWithObjects: obj1, obj2, obj3, nil]; 

El segundo se detendrá en el primer argumento nulo. Se espera una matriz con tres elementos, pero si obj1! = Nil y obj2 == nil, el resultado es una matriz con un elemento. El primero arroja una exception si alguno de obj1, obj2 u obj3 es nulo.