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
Oder http://stackoverflow.com/questions/8714875/why-does-xcode-4-2-use-autoreleasepool-in-main-m-instead-of-nsautoreleasepool –