wake-up-neo.com

Was ist Autoreleasepool?

Mögliches Duplikat:
Warum Autorelease-Pool verwenden?

Die gesamte Objective-C-Startseite wird mit einer Standardanweisung @autoreleasepool{...} Unter der Deklaration der Hauptfunktion geöffnet. Aber was macht diese Aussage eigentlich? Das neue Objective-C gibt Objekte automatisch frei und das Löschen der Zeile ändert nichts am Programm. Ist dieser Befehl wirklich notwendig?

57
moray95

Das @autoreleasepool Anweisung erledigt den gleichen Job wie zuvor, anstatt die Klasse NSAutoreleasePool zu verwenden. Die Funktionsweise von NSAutoreleasePool war etwas seltsam, da das Erstellen von NSAutoreleasePool eine Auswirkung auf die gesamte Anwendung hatte. @autoreleasepool erstellt einen Bereich mit Gültigkeitsbereichen und macht klarer, was sich im Pool befindet und wann er abläuft (wenn er außerhalb des Gültigkeitsbereichs liegt). Laut Apple ist es auch effizienter.

Das Konzept eines Autorelease-Pools ist einfach, wenn eine Objektinstanz als autoreleased markiert ist (z. B. NSString* str = [[[NSString alloc] initWithString:@"hello"] autorelease];) hat es zu diesem Zeitpunkt einen Erhaltungszähler von +1, aber am Ende der Laufschleife wird der Pool geleert, und für jedes Objekt, das als autorelease markiert ist, wird der Erhaltungszähler dekrementiert. Dies ist eine Möglichkeit, ein Objekt in der Nähe zu halten, während Sie alles vorbereiten, was es für sich behalten soll.

Während bei ARC das Schlüsselwort autorelease nicht vom Entwickler verwendet wird, fügt das zugrunde liegende System, das ARC verwaltet, dies für Sie ein. ( Denken Sie daran: ARC fügt nur retain-, release- und autorelease-Aufrufe für Sie ein zu den entsprechenden Zeiten). Aus diesem Grund muss das bestehende AutoreleasePool-Konzept beibehalten werden.

Wenn Sie den Autorelease-Pool entfernen, beginnen Ihre Objekte zu lecken

In einer Umgebung mit Referenzzählung erwartet Cocoa, dass immer ein Autorelease-Pool verfügbar ist. Wenn ein Pool nicht verfügbar ist, werden automatisch freigegebene Objekte nicht freigegeben und Sie verlieren Speicher. In dieser Situation protokolliert Ihr Programm normalerweise geeignete Warnmeldungen.

80
WDUK