2009-04-28 15 views

Antwort

25

Beachten Sie, dass die Kommentare zur Sauerstoffantwort, die besagt, dass -Drain den NSAutoreleasePool nicht freigibt, nicht korrekt sind. Die documentation for NSAutoreleasePool sagt eindeutig, dass -Drain den NSAutoreleasePool freigibt (und damit zerstört).

-drain ist ein Ersatz für die Verwendung von -freigabe für NSAutoreleasePool-Objekte, der einzige Unterschied ist, dass ein Hinweis auf das Garbage Collection-System bietet.

+0

Danke. Also, auf iPhone OS ist es besser, -release statt -drain zu verwenden? – Thanks

+1

In einer Nicht-GC-Umgebung sind sie gleich. Außer in dem seltenen Fall, dass Sie aus irgendeinem Grund dem GC-System keinen Hinweis geben möchten, wenn der Code jemals im GC-Modus verwendet wurde, gibt es keinen Grund, in Code-Targeting 10.4+ Release statt Drain zu verwenden. – smorgan

+1

Apple verwendet-Release für den ARP in der main() -Funktion ... – Thanks

10

Wenn Ihr System eine Garbage Collection hat, dann Nachricht -Drain senden (objc_collect_if_needed) für GC

Wenn Sie nicht GC haben, dann abtropfen lassen = Release

+0

also würde ein -drain auch den Pool selbst freigeben, oder? – Thanks

+1

-retain und -Drain-Methoden nicht ändert retainCount von NSAutoreleasePool Objekt Sie nur Freigabemeldung im Pool auf alle Objekte senden Ich weiß nicht, wie und wann NSAutoreleasePool Objekte verwüstete ((( – oxigen

+1

Nein, abtropfen lassen das entbindet Pool Es gibt keine Magie, wenn es um Autorelease-Pools und behalten zählt, sie folgen den gleichen Regeln wie jedes andere Objekt außer sie können nicht behalten oder Autoreleased sein (was sowieso nicht viel Sinn machen würde) –

10

Oxigen richtig ist, die Dokumentation für die Methode sehen drain von NSAutoreleasePool:

In einer Referenzzählung Umgebung, Mitteilungen und knallt den Hörer; in einer Garbage-Collected-Umgebung löst Garbage Collection aus, wenn der Speicher, der seit der letzten -Auflistung zugeordnet wurde, größer ist als der aktuelle -Schwellenwert.

Verwandte Themen