Digamos que tengo una clase de vista de tabla que enumera 100 objetos Foo. Dispone de:¿Está bien que varios objetos retengan el mismo objeto en Objective-C/Cocoa?
@property (nonatomic, retain) NSMutableArray* fooList;
y llenarlo con Foos como:
self.fooList = [NSMutableArray array]; while (something) { Foo* foo = [[Foo alloc] init]; [fooList addObject:foo]; [foo release]; }
Primera pregunta: ¿porque el NSMutableArray se marca como retener, eso significa que todos los objetos en su interior se conservan también? ¿Estoy agregando correctamente el foo y liberando la copia local después de que se ha agregado a la matriz? ¿O me estoy perdiendo una llamada retener?
Entonces, si el usuario selecciona una fila específica en la tabla y quiero mostrar una vista Foo detalle que llamo:
FooView* localView = [[FooView alloc] initWithFoo:[self.fooList objectAtIndex:indexPath.row]]; [self.navigationController pushViewController:localView animated:YES]; [localView release];
Ahora la clase FooView tiene:
@property (nonatomic, retain) Foo* theFoo;
por lo que ahora AMBOS la matriz se aferra a ese Foo, así como a FooView. Pero eso parece estar bien ¿no? Cuando el usuario presiona el botón Atrás se llamará a dealloc en FooView y se llamará a [la versión de Foo]. Luego, se golpea otro botón de retroceso y se llama a dealloc en la clase de vista de tabla y se llama a [lanzamiento de fooList].
Se podría argumentar que la clase FooView debe tener:
@property (nonatomic, assign) Foo* theFoo;
frente a retener. Pero a veces la clase FooView se llama con un Foo que no está también en una matriz. Así que quería asegurarme de que estaba bien tener dos objetos agarrados al mismo otro objeto.
Typo: "... y liberan sus objetos de contenido cuando se lanza el objeto de colección." Los objetos en colecciones no se liberan hasta que la colección * se desasigna *. – JeremyP
Gracias, corregido. Aunque se podría argumentar que por "liberado" quise decir "el último lanzamiento, por el cual el conteo de retención va a cero, lo que desencadena el desalojo": P, pero solo decir "dealloc" es más claro en ese contexto. – Jaanus