Betrachten Sie das folgende Programm:
%Vor% Ich verstehe nicht, warum pool
dort gebraucht wird, da das gleiche Programm auch so geschrieben werden kann:
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?
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.
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.
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.
Tags und Links objective-c