2008-10-07 37 views
14

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.NSMutableArray destrucción

Se asigna en la función init al igual que

self.list = [NSMutableArray array]; 

Los diferentes métodos que he utilizado para desactivarla a cabo incluyen:

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

y

[self.eventList removeAllObjects]; 

explícitamente la asignación y liberación la matriz tampoco funciona. La fuga SÓLO ocurre cuando trato de restablecer la lista.

¿Se está perdiendo un paso al reiniciar o este es un problema diferente?

Respuesta

9

¿Cómo se crearon los objetos que tienen fugas? Si hizo algo como esto:

- (void)addObjectsToArray { 

    [list addObject:[[MyClass alloc] init]; 

    OtherClass *anotherObject = [[OtherClass alloc] init]; 
    [list addObject:anotherObject]; 
} 

entonces se escapará dos objetos cuando se cancela la asignación lista.

se 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]; 
} 

En más detalle:

Si sigue el primer patrón, que ha creado dos objetos que, de acuerdo con el Cocoa memory management rules de su propiedad. Es su responsabilidad renunciar a la propiedad. Si no lo hace, el objeto nunca será desasignado y verá una fuga.

No ve una fuga de inmediato, sin embargo, 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.

4

¿cómo se ve su declaración @property? ¿estás sintetizando los accesorios? Si es así, necesita @property(retain). Supongo que cuando dices que los objetos te están atacando, te estás refiriendo a un volcado del núcleo (EXC\_BAD\_ACCESS).

+0

@property (nonatomic, retener) NSMutableArray * list; Tengo una sintetizar, pero el volcado del núcleo solo ocurre cuando trato de liberar los objetos manualmente. Lo que quiero decir al activarme es que los objetos se escapan (creo) – SageAMDP

+0

¿cómo sabes que están goteando? ¿Estás revisando instrumentos? ¿Fugas? Si obtiene accesos incorrectos, eso significa que está liberando algo que ya está desmantelado. Las fugas son más difíciles de encontrar en el sentido de que necesita usar una herramienta para atraparlas (o simplemente ver crecer su memoria). – Elfred

+1

, si está haciendo [list addObject: [[MyObj alloc] init]; y posterior [list removeAllObjects]; probablemente esté goteando. La solución sería proporcionar un método de clase que devuelva un objeto liberado automáticamente. – Elfred

6

¿Se está refiriendo a los objetos en la matriz con fugas?

¿Cómo agregas 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]; 
+0

- (void) addEventToList:.. (Evento *) inEvent { \t [addObject self.list: inEvent]; \t \t [liberación inEvent]; } El objeto pasado se crea lik e este [[Event alloc] init]; – SageAMDP

+0

Lo que sea que pase en evento debe liberarlo, no el código al que se le pasa. Liberar un objeto del que no sabes la procedencia de es malo. –

+0

Todavía tengo una fuga cada vez que trato de borrar la matriz. La cosa más extraña de la historia. Tengo el método que crea el evento que lo libera después de que se pasa. Todo funciona bien sin eliminar todos los objetos de la matriz. – SageAMDP

0

Yo diría que realmente no tengo suficiente información aquí para darle una buena respuesta. ¿Está diciendo que el 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 el conjunto todavía se asignan a pesar de que deberían 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 aún están en la memoria pero no hacen referencia a nada.

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

0

Si la fuga solo se produce cuando intentas restablecer la lista, tienes a alguien/alguien más usando esos otros objetos que acabas de intentar liberar.