Was ist der Punkt, in einem retain sofort von einem Autofreigabe gefolgt?
-
30-09-2019 - |
Frage
Ich bin irgend Open-Source-Code suchen und zu versuchen, zu verstehen, warum der Autor etwas getan in einer bestimmten Art und Weise hat.
Die Klasse ist ein Wrapper um NSArray
eine Stapel-Datenstruktur mit Push zu erstellen, Pop, etc.
Eine Methode ist topObject
, die das oberste Objekt auf dem Stapel zurückkehrt und seine Umsetzung ist:
- (id)top {
return [[[stack lastObject] retain] autorelease]; // stack is an instance of NSMutableArray
}
Was ist mit der durch eine sofortige Autofreigabe gefolgt retain?
Meine erste Reaktion war, dass dieser einen Analysator Warnung über ein Speicherleck verhindern würde, aber ich analysiert, ohne behalten / Autorelease und es gab noch keine Warnung.
am Lebenszyklus der Suche würde ein Objekt auf den Stapel erstellt, geschoben werden und freigegeben, so dass der Stapel das Objekt besitzt (das zugrunde liegende Array es bei Zugabe beibehalten wird).
Also habe ich die Verwendung des behalten nicht verstehen / Autorelease hier ...
Lösung
Nehmen wir an, top
würde wie folgt aussehen:
- (id) top {
return [stack lastObject];
}
Dann vorstellen, dass diese:
foo = [bar top];
[bar removeAllObjects];
// Do something with foo
Im Folgenden passieren würde: Die zweite Zeile würde den Abfall auf 0 zählen machen behalten, und von der dritten Zeile foo
zu deallokierten Speichern zeigen würde. Aber mit dem retain
und autorelease
den Beibehaltungszähler 1 ist, bis der Pool entleert wird somit in der dritten Zeile foo
würde noch zeigen Sie auf ein gültiges Objekt.