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 ...

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top