Ich bin neu in Speicher verwaltetem Code, aber ich verstehe die Idee ziemlich gut.Objective-C-Version, Autorelease und Datentypen
Als ich meine App durch das Leaks-Tool in XCode nahm, bemerkte ich, dass ich nur meine benutzerdefinierten Objekte aufräumen musste, aber nicht dynamisch erstellte Arrays, also dachte ich mir, dass diese Datentypen automatisch freigegeben sind - sinnvoll, da ich nur hatte um die Arrays freizugeben, die ich als Eigenschaften verwendet habe, die auf ihnen (behalten) hatten.
Dann bemerkte ich etwas Eigenartiges:
NSMutableArray *removals = [NSMutableArray new];
aber nicht einen ähnlichen
NSMutableArray *removals = [NSMutableArray arrayWithCapacity:9];
Jetzt einrichten, der Grund, warum man war: Ich war ein Leck an einem bestimmten Array wie folgt initialisiert bekommen mit "neu" ist, dass es 0 bis 99 Elemente enthalten könnte, während das andere, das ich kannte, immer 9 sein würde. Da beide Arrays später auf der Grundlage der Benutzerinteraktion an dieselbe Methode übergeben werden, bekam ich entweder ein Leck wenn ich nicht am Ende der Methode freigelassen habe, oder eine Ausnahme, wenn ich es getan habe!
änderte ich das erste Array
NSMutableArray *removals = [NSMutableArray arrayWithCapacity:99];
und ich bekomme keine Lecks und müssen nicht alles lösen. Kann mir jemand erklären?
** Alle ** dieser Methoden geben ein Objekt mit einer Retain-Anzahl von 1 zurück. Der Unterschied besteht nur darin, dass Sie das Objekt besitzen und es daher freigeben müssen und mit den anderen nicht Objekt und sind nicht erforderlich, um es freizugeben (aber kann auch nicht darauf zählen, dass es um die aktuelle Anrufkette herum ist). – Chuck
Streng genommen, nein, das ist ein Implementierungsdetail. In einer Reihe von Fällen geben sie Dinge mit unterschiedlichen Rücklagen zurück. Zum Beispiel = [UIImage imageNamed:] kann etwas mit einem sehr großen großen retainCount zurückgeben, weil es ein zwischengespeichertes Bild wiederverwenden könnte. –
Nun ja, die Retain-Zählung selbst ist ein Implementierungsdetail. Apple's Dokumente sagen so viel. Und in allen Fällen, die Sie oben bei aktuellen Versionen von OS X aufgelistet haben, ist der Wert dieses Implementierungsdetails 1. – Chuck