ARC memory leaks
Erlebe ich Speicherverlusten verbunden NSMutableArray in einem Projekt konfiguriert ARC, die ich dachte, war handhaben soll, die diese Dinge für Sie.
Folgende code löst Lecks von NSNumbers:
NSMutableArray *myArray = [[NSMutableArray alloc] init];
NSNumber *myNumber = [NSNumber numberWithFloat:10];
[myArray addObject:myNumber];
Läuft die Letzte Zeile gibt die folgenden in den debugger:
objc[1106]: Objekt 0x765ffe0 der Klasse __NSCFNumber autoreleased mit kein Schwimmbad im Ort - nur undicht - Pause auf objc_autoreleaseNoPool() zu Debuggen
Abgesehen davon, das Objekt erscheint, korrekt Hinzugefügt, um die mutable-array,
Mache ich was offensichtlich falsch?
Hinweis: Es gibt eine Klasse in dem Projekt, die ich nicht bekommen konnte, um die Arbeit mit BOGEN, und so habe ich ausgeschlossen, es aus BOGEN mit dem compiler-flag -fno-objc-arc. Aber die Lecks auftreten, die in anderen Klassen, die mit der ARC. Nicht sicher, ob das verwandt ist.
Vielen Dank für Eure Hilfe.
InformationsquelleAutor der Frage Spinoxa | 2012-03-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist wahrscheinlich dieser code auf einem hintergrund-thread und nicht ein autorelease pool im Ort. ARC wird noch autorelease-Objekte für Sie bei Gelegenheit, und wenn Sie den Aufruf in den Apple-frameworks, kann Sie immer noch nicht den BOGEN, so dass Sie definitiv könnte autoreleasing Objekte für Sie. So müssen Sie noch einen autorelease-pool statt.
Kakao schafft eine autorelease-pool für Sie auf dem Haupt-thread, aber nicht alles tun, für Sie auf hintergrund-threads. Wenn Sie gehen, um kick etwas abseits auf einem hintergrund-thread, ohne mit
NSOperation
oder so, werden Sie wollen, wickeln Sie diesen thread in eine@autoreleasepool
:InformationsquelleAutor der Antwort BJ Homer
Sehr wahrscheinlich, dass Sie definiert haben, die NSMutableArray als statische variable. Wenn Sie das tun, Sie fallen außerhalb der Grenzen jeglicher autorelease-pool, da statische Definitionen werden aktiviert, die außerhalb einer runloop. ARC ist nicht magisch, es ist einfach, automatisiert die Speicherverwaltung fordert, im Rahmen der vorhandenen retain/release-framework und kann daher nicht helfen in diesen Fällen.
Die Lösung ist die Initialisierung der statischen variable, die irgendwo in einer Klasse, so dass Ihre mutable-array gebaut, in die runloop.
InformationsquelleAutor der Antwort Kendall Helmstetter Gelner