2008-10-07 7 views
14

Ich habe ein Array NSMutableArray mit glücklichen Objekten. Diese Objekte schalten mich bösartig ein, wenn ich versuche, die Anordnung aller Objekte zu löschen und neu zu bevölkern.NSMutableArray Zerstörung

Es ist in der init-Funktion zugeordnet ist wie so

self.list = [NSMutableArray array]; 

Die verschiedenen Methoden, die ich verwendet habe, es zu räumen sind:

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

und

[self.eventList removeAllObjects]; 

Explizit Zuteilung und Freigabe Das Array funktioniert auch nicht. Das Leck tritt nur auf, wenn ich versuche, die Liste zurückzusetzen.

Fehle ich einen Schritt beim Zurücksetzen oder ist das ein anderes Problem?

Antwort

9

Wie haben Sie die Objekte erstellt, die undicht sind? Wenn Sie so etwas wie dies tun:

- (void)addObjectsToArray { 

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

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

dann werden Sie zwei Objekte lecken, wenn die Liste freigegeben wird.

Sie sollten einen solchen Code mit ersetzen:

- (void)addObjectsToArray { 

    MyClass *myObject = [[MyClass alloc] init]; 
    [list addObject:myObject]; 
    [myObject release]; 

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

Im Detail:

Wenn Sie das erste Muster folgen, haben Sie zwei Objekte erstellt, die nach dem Cocoa memory management rules Sie besitzen. Es liegt in Ihrer Verantwortung, das Eigentum aufzugeben. Wenn Sie dies nicht tun, wird das Objekt niemals freigegeben und Sie sehen ein Leck.

Sie sehen jedoch kein Leck sofort, weil Sie die Objekte an das Array übergeben, das auch die Eigentümer übernimmt. Das Leck wird nur erkannt, wenn Sie die Objekte aus dem Array entfernen oder wenn das Array selbst freigegeben wird. Wenn eines dieser Ereignisse eintritt, gibt das Array das Eigentum an den Objekten auf und diese bleiben in Ihrer Anwendung "live", aber Sie haben keine Referenzen darauf.

4

Wie sieht Ihre Deklaration aus? synthetisierst du die Accessoren? Wenn ja, benötigen Sie @property(retain). Ich nehme an, wenn Sie sagen, dass die Objekte Sie einschalten, beziehen Sie sich auf einen Core-Dump (EXC\_BAD\_ACCESS).

+0

@Eigenschaft (nicht atomisch, behalten) NSMutableArray * -Liste; Ich habe eine Synthese, aber der Core-Dump passiert nur, wenn ich versuche, die Objekte manuell freizugeben. Was ich meine, wenn ich mich einschalte, sind die Objekte, die undicht werden (ich denke) – SageAMDP

+0

Woher weißt du, dass sie undicht sind? Prüfen Sie Instrumente/Lecks? Wenn Sie schlechte Zugriffe erhalten, bedeutet das, dass Sie etwas freigeben, das bereits freigegeben ist. Leaks sind in dem Sinne schwerer zu finden, dass Sie ein Tool verwenden müssen, um sie zu fangen (oder sehen Sie einfach, wie Ihr Speicher wächst). – Elfred

+1

Also, wenn Sie tun [Liste addObject: [[MyObj Alloc] init]; und höher [list removeAllObjects]; Sie sind wahrscheinlich undicht. Die Lösung wäre, eine Klassenmethode bereitzustellen, die ein automatisch freigegebenes Objekt zurückgibt. – Elfred

6

Beziehen Sie sich auf die Objekte im Array undicht?

Wie fügen Sie dem Array Objekte hinzu? Das Array behält sie bei, also müssen Sie sie automatisch freigeben oder freigeben, nachdem Sie sie dem Array hinzugefügt haben. Andernfalls werden die Objekte nach dem Freigeben des Arrays weiterhin beibehalten (leaked).

+0

- (void) addEventToList: (Ereignis *) inEvent { \t [self.list addObject: inEvent]; \t \t [inEvent release]; } Das Objekt übergeben wird, erzeugt lik e dies [[Ereigniszuweisung] init]; – SageAMDP

+0

Was auch immer inEvent übergeben wird, sollte es freigeben, nicht den Code, an den es übergeben wird. Ein Objekt zu veröffentlichen, von dem Sie nicht wissen, woher es stammt, ist schlecht. –

+0

Ich habe immer noch ein Leck, wenn ich versuche, das Array zu löschen. seltsamste Sache überhaupt. Ich habe die Methode, die das Ereignis erstellt, das es freigibt, nachdem es übergeben wurde. Alles funktioniert gut, ohne alle Objekte im Array zu entfernen. – SageAMDP

0

Ich würde sagen, ich habe nicht wirklich genug Informationen hier, um Ihnen eine gute Antwort zu geben. Wollen Sie damit sagen, dass die NSMutableArray immer noch zugewiesen ist, aber leer ist und keine Objekte enthält, aber dass die zuvor im Array vorhandenen Objekte noch zugewiesen sind, obwohl sie zu diesem Zeitpunkt in der App freigegeben werden sollten?

Wenn dies der Fall ist, könnte das Array möglicherweise leer sein, aber Ihre Objekte verarbeiten die an sie gesendete Dealloc-Nachricht nicht. In diesem Fall sind die Objekte immer noch im Speicher vorhanden, aber von nichts referenziert.

Ich würde sagen, um Ihnen zu helfen Ich würde gerne genau wissen, was MallocDebug genau sagt, wird durchgesickert. Auch gibt @Elfred einige gute Ratschläge in der Überprüfung Ihrer @property Methode für das Array, wirklich sollte es behalten oder kopieren werden.

0

Wenn das Leck nur auftritt, wenn Sie versuchen, die Liste zurückzusetzen, haben Sie jemanden/etwas anderes, das diese anderen Objekte verwendet, die Sie gerade versucht haben zu veröffentlichen.