versiones objective framework español ejemplos objective-c cocoa

objective c - objective - Destrucción de NSMutableArray



xcode (5)

Tengo una matriz NSMutableArray con objetos felices. Estos objetos se encienden con fiereza (fugas) cada vez que trato de borrar la matriz de todos los objetos y repoblarla.

Se asigna en la función init como tal

self.list = [NSMutableArray array];

Los diferentes métodos que he usado para limpiarlo incluyen:

self.list = nil; self.list = [NSMutableArray array];

y

[self.eventList removeAllObjects];

Asignar y liberar explícitamente la matriz tampoco funciona. La fuga SÓLO ocurre cuando trato de restablecer la lista.

¿Me estoy perdiendo un paso al reiniciar o este es un problema diferente?


¿Cómo se crearon los objetos que se están escapando? Si hiciste algo como esto:

- (void)addObjectsToArray { [list addObject:[[MyClass alloc] init]; OtherClass *anotherObject = [[OtherClass alloc] init]; [list addObject:anotherObject]; }

entonces se filtrarán dos objetos cuando la lista se desasigna.

Debe reemplazar cualquier código con:

- (void)addObjectsToArray { MyClass *myObject = [[MyClass alloc] init]; [list addObject:myObject]; [myObject release]; OtherClass *anotherObject = [[OtherClass alloc] init]; [list addObject:anotherObject]; [anotherObject release]; }

Con más detalle:

Si sigue el primer patrón, habrá creado dos objetos que, de acuerdo con las reglas de administración de la memoria Cocoa, son de su propiedad. Es su responsabilidad renunciar a la propiedad. Si no lo hace, el objeto nunca será desasignado y verá una fuga.

Sin embargo, no ve una fuga de inmediato porque pasa los objetos a la matriz, que también se apropia de ellos. La fuga solo se reconocerá cuando elimine los objetos de la matriz o cuando la matriz misma se desasigna. Cuando ocurre cualquiera de esos eventos, la matriz renuncia a la propiedad de los objetos y se dejan "en vivo" en su aplicación, pero no tendrá ninguna referencia a ellos.


¿Te estás refiriendo a los objetos en la matriz que gotea?

¿Cómo está agregando objetos a la matriz? La matriz los conservará, por lo que deberá soltarlos o soltarlos una vez que los haya agregado a la matriz. De lo contrario, una vez liberada la matriz, los objetos se conservarán (se filtrarán).

MyEvent *event = [[MyEvent alloc] initWithEventInfo:info]; [self.eventList addObject:event]; [event release]; MyEvent *otherEvent = [[[MyEvent alloc] initWithEventInfo:otherInfo] autorelease]; [self.eventList addObject:otherEvent];


Si la fuga solo ocurre cuando intentas restablecer la lista, tienes a alguien / algo más que usa esos otros objetos que intentas liberar.


¿Cómo es tu declaración @property ? ¿estás sintetizando los accesorios? Si es así, necesita @property(retain) . Supongo que cuando dices que los objetos te están activando, te estás refiriendo a un volcado de núcleo (EXC/_BAD/_ACCESS) .


Diría que realmente no tengo suficiente información aquí para darle una excelente respuesta. ¿Está diciendo que NSMutableArray todavía está asignado, pero está vacío y no tiene ningún objeto en él, pero que los objetos una vez anteriormente en la matriz todavía se asignan a pesar de que deben ser tratados en ese punto de la aplicación?

Si ese es el caso, la matriz podría estar vacía, pero sus objetos no están manejando el mensaje dealloc que se les envió, en cuyo caso los objetos todavía están en la memoria pero no hacen referencia a nada.

Diría que para ayudarlo me gustaría saber exactamente qué es lo que MallocDebug dice exactamente que se está filtrando. También @Elfred está dando algunos buenos consejos para verificar el método @property para la matriz, realmente debería ser retener o copiar.