2013-02-03 11 views
45

Mögliche Duplizieren:
Why use Autorelease pool?Was ist Autorespool?

Alle Objective-C Startseite öffnet sich mit einem Standard-@autoreleasepool{...} Anweisung unter der Hauptfunktionsdeklaration. Aber was macht diese Aussage eigentlich? Das neue Objective-C gibt automatisch Objekte frei und das Löschen der Zeile ändert nichts am Programm. Ist dieser Befehl wirklich notwendig?

+0

Oder http://stackoverflow.com/questions/8714875/why-does-xcode-4-2-use-autoreleasepool-in-main-m-instead-of-nsautoreleasepool –

Antwort

71

Die Anweisung @autoreleasepool führt die gleiche Aufgabe aus wie zuvor, anstatt die Klasse NSAutoreleasePool zu verwenden. Die Art und Weise, wie das NSAutoreleasePool funktionierte, war etwas komisch, da das Erstellen eines NSAutoreleasePools einen Effekt in der gesamten Anwendung verursachte; @autoreleasepool erstellt einen Bereichsbereich und macht es klarer, was sich innerhalb des Pools befindet und wann es drainiert wird (wenn es den Geltungsbereich verlässt). Es ist auch effizienter nach Apple.

Das Konzept eines Autorelease-Pools ist einfach, wenn eine Objektinstanz als automatisch freigegeben markiert wird (z. B. NSString* str = [[[NSString alloc] initWithString:@"hello"] autorelease];), hat sie zu diesem Zeitpunkt eine Retain-Zählung von +1, aber am Ende der Ausführungsschleife , der Pool ist leer, und bei jedem Objekt, das als Autorelease gekennzeichnet ist, wird der Retain-Zähler dekrementiert. Es ist eine Art, ein Objekt herumzuhalten, während man alles vorbereitet, was es für sich selbst behalten wird.

Mit ARC, während das Schlüsselwort autorelease vom Entwickler nicht verwendet wird, fügt das zugrundeliegende System, das ARC verwaltet, das für Sie ein. (Erinnern Sie sich: Alle ARC macht gerade retain, release und autorelease Anrufe für Sie zu den entsprechenden Zeiten). Aus diesem Grund muss das bestehende AutoreleasePool-Konzept beibehalten werden.

Wenn Sie den Autofreigabepool entfernen, starten Sie Ihre Objekte

In einer Referenz gezählt Umgebung austritt, erwartet Cocoa dort ein Autofreigabepool immer zur Verfügung steht. Wenn ein Pool nicht verfügbar ist, werden automatisch freigegebene Objekte nicht freigegeben, und Sie verlieren Speicher. In diesem Fall protokolliert Ihr Programm normalerweise geeignete Warnmeldungen. vielleicht

+0

Bedeutet dies, dass, wenn Ich benutze ARC und lasse ein Objekt irgendwo außerhalb des "@autoreleasepools" {} '' das Objekt existiert bis zum Ende des @autoreleasepool-Blocks? – confile

+2

Wenn Sie ein automatisch freigegebenes Objekt manuell freigeben, wenn Sie das Ende des Autorelease-Pools erreichen, ist das Dealloc-Objekt nicht mehr vorhanden und Sie werden wahrscheinlich irgendwo in Frameworks oder Maschinencode eine Ausnahme treffen. Wenn es sich um einen langen Codeweg handelt, kann es sein, dass Ihre App scheinbar an einer Stelle zusammenbricht, die keinen Zusammenhang schafft. – jcpennypincher