Warum NSAutoreleasePool verwenden?

8

Betrachten Sie das folgende Programm:

%Vor%

Ich verstehe nicht, warum pool dort gebraucht wird, da das gleiche Programm auch so geschrieben werden kann:

%Vor%

Was ist ein Zweck der Verwendung eines automatischen Release-Pools? Warum und wann brauchen wir sie? Sind sie in jedem objektiven C-Programm obligatorisch?

Wenn ich kein Objekt automatisch freigeben möchte, muss ich auch einen Auto Release-Pool verwenden?

    
Matrix 07.09.2010, 13:47
quelle

6 Antworten

7
  

Aber wenn ich kein Objekt automatisch freigeben möchte, brauche ich auch den Auto Release Pool ??

Beachten Sie auch, dass die Cocoa-Bibliothek autorelease extensiv verwendet. Also, selbst wenn Sie denken, dass Sie den Pool nicht in Ihrem Code verwenden, müssen Sie den Pool vorbereiten.

    
Yuji 07.09.2010, 17:40
quelle
5

NSObject enthält eine ordentliche Funktion namens autorelease . Dies bedeutet, dass alle Objekte in Objective-C diese Funktion enthalten.

Diese Funktion fügt self in den Autorelease-Pool ein und verzögert den Aufruf der release -Funktion des Objekts, bis der Pool der Autorelease freigegeben wird. Die meisten internen APIs verwenden einen Autorelease-Pool, und neben dem, der sich in main() befindet, wird in jedem Durchlauf eine UIKit-Hauptschleife zugewiesen und freigegeben.

Kurz gesagt: es ist die Warteschlange für das verzögerte Dekrementieren des Referenzzählers.

Beispiel für die automatische Freigabe:

%Vor%

Dieses Objekt ist zugewiesen, und die automatische Freigabe wird aufgerufen. Wie würdest du es selbst benutzen?

%Vor%

Warum ist das gut? Wenn Sie dieses Objekt zurückgeben, muss die aufrufende Funktion dieses Objekt nicht freigeben, und optional kann es es beibehalten (muss aber nicht).

Um vier Jahre später zu erweitern und zu verdeutlichen:

Während UIKit und AppKit einen NSAutoreleasePool im Verlauf ihres Haupt-Runloops erstellen und leeren, müssen Sie es in Ihrem nicht-GUI-Programm selbst erstellen. Verschiedener Code erwartet, dass ein NSAutoreleasePool vorhanden ist, und da Sie kein GUI-Framework initialisiert haben oder eines verwenden, gibt es keinen Code, der es magisch für Sie erstellt.

Während NSLog() und eine Konstante NSString in Ihrem Beispiel keinen Pool benötigen, sogar das triviale [NSMutableArray array] , da es tatsächlich als [[[NSMutableArray alloc] init] autorelease] interpretiert werden kann.

    
Ivan Vučica 07.09.2010 13:51
quelle
0

Lesen Sie die Dokumentation von NSAutoreleasePool

    
Jeff 07.09.2010 13:49
quelle
0

Ich habe Grund gefunden ... "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."

    
Matrix 07.09.2010 13:52
quelle
0

Eine allgemeine Einführung finden Sie auf der Apple-Website:

miku 07.09.2010 13:51
quelle
0

Sie müssen in der Regel keinen Autorelease-Poolblock selbst erstellen oder den Code sehen, mit dem Sie einen erstellen. drei Gelegenheiten, wenn Sie Ihre eigenen Autorelease-Pool-Blöcke verwenden könnten,

  • Wenn Sie ein Programm schreiben, das nicht auf einem UI-Framework basiert, wie ein Befehlszeilentool.

  • Wenn Sie eine Schleife schreiben, die viele temporäre Objekte erstellt - Sie können verwenden ein Autorelease-Poolblock innerhalb der Schleife, um diese Objekte zu beseitigen vor der nächsten Iteration. Verwenden eines Autorelease - Poolblocks in der Schleife hilft, den maximalen Speicherbedarf der Anwendung zu reduzieren.

  • Wenn Sie einen sekundären Thread erstellen, müssen Sie Ihren eigenen erstellen Autorelease-Poolblock, sobald der Thread ausgeführt wird; Andernfalls wird Ihre Anwendung Objekte verlieren.

thatzprem 10.11.2014 07:39
quelle

Tags und Links