Ja und nein. Sie würden am Ende den String-Speicher freigeben, aber das NSAutoreleasePool-Objekt in den Speicher "verlieren", indem Sie Drain anstelle von Release verwenden, wenn Sie dies in einer durch Müll gesammelten (nicht speicherverwalteten) Umgebung ausführen. Dieses "Leck" macht die Instanz von NSAutoreleasePool einfach "nicht erreichbar" wie jedes andere Objekt ohne starke Zeiger unter GC, und das Objekt würde beim nächsten Ausführen von GC bereinigt, was sehr wohl direkt nach dem Aufruf von -drain
:
ablassen
Löst in einer Speicherbereinigungsumgebung die Speicherbereinigung aus, wenn der seit der letzten Erfassung zugewiesene Speicher größer als der aktuelle Schwellenwert ist. verhält sich ansonsten wie Release. ... In einer Müllsammelumgebung ruft diese Methode letztendlich auf objc_collect_if_needed
.
Ansonsten ist es ähnlich wie -release
bei Nicht-GC, ja. Wie andere angegeben haben, -release
handelt es sich bei GC um ein No-Op. Die einzige Möglichkeit, um sicherzustellen, dass der Pool unter GC ordnungsgemäß funktioniert, besteht darin -drain
, und -drain
unter Nicht-GC funktioniert genau wie -release
unter Nicht-GC und kommuniziert seine Funktionalität möglicherweise klarer als Gut.
Ich sollte darauf hinweisen, dass Ihre Anweisung "alles, was mit new, alloc oder init aufgerufen wird" nicht "init" enthalten sollte (sondern "copy"), da "init" keinen Speicher zuweist, sondern nur das Objekt (Konstruktor) einrichtet Mode). Wenn Sie ein zugewiesenes Objekt erhalten und Ihre Funktion nur init als solches aufgerufen hätte, würden Sie es nicht freigeben:
- (void)func:(NSObject*)allocd_but_not_init
{
[allocd_but_not_init init];
}
Das verbraucht nicht mehr Speicher als Sie bereits begonnen haben (vorausgesetzt, init instanziiert keine Objekte, aber Sie sind trotzdem nicht dafür verantwortlich).