2012-08-04 11 views
5

In der iOS-App-Entwicklung verwenden wir NSAutoreleasePool, um das Eigentum an Objekten zu einem späteren Zeitpunkt aufzugeben.Warum müssen wir NSAutoreleasepool für jeden Thread verwenden?

Aber warum kann es zwischen verschiedenen Threads geteilt werden?

Warum müssen wir einen neuen Autorespool erstellen, wenn ich einen neuen Thread verwenden möchte?

EDIT:

Wie taskinoor meine Frage erwähnt wurde, warum dies so ausgelegt ist, dass jeder Thread eine separate autoreleasepool haben sollte.

+1

[Diese Frage steht in engem Zusammenhang mit Ihrer Frage] (http://stackoverflow.com/questions/4547652/does-every-thread-reed-its-own-autorelease-pool) –

+1

Sie sollten über die Verwendung von '@ denken Autorespulepool {...} 'anstelle von' NSAutoreleasePool'. Laut der Dokumentation ist es effizienter. Und wenn Sie zu ARC migrieren, ist dies obligatorisch. –

+0

Ich weiß nicht, warum Sie diese Änderung benötigt, meine Antwort erklärt den Grund dafür :) –

Antwort

5

Die Entwurfsherausforderung für Multi-Thread-Autorelease-Pools besteht darin, wann sie entwässert werden müssen. Wenn Sie den Pool leeren, während ein Objekt noch benutzt wird, stürzen Sie ab. Pro Thread ist es leicht zu erkennen, wenn Sie sich außerhalb der Laufschleife befinden und somit an einem Punkt, an dem automatisch freigegebene Objekte gelöscht werden können. In einer Multithread-Situation müssten Ihre Threads am Ende ihrer Runloops synchronisiert werden, damit Sie sicher sein können, dass Sie an einem sicheren Punkt sind, um sie zu entleeren. Synchronisierte Laufflächen auf diese Weise ist eine schlechte Idee, es schafft viel Leerlauf und verlangsamt das Programm.

+1

Gehen Sie noch einen Schritt weiter; Wenn ein Thread blockiert ist und auf irgendetwas wartet - Netzwerk, Thread-Status, andere E/A -, kann der gesamte Pool nicht gelöscht werden. – bbum

0

Ich glaube nicht, die Autorelease-Pools werden zwischen Threads gemeinsam genutzt, nach apples memory management guide in Cocoa jeder Thread seinen eigenen Stapel von Autofreigabepools

hat

Wenn Sie nicht über einen Autofreigabepool für Threads erstellen, die Sie erstellen oder trennen, dann die Autorelease-Funktion funktioniert nicht, so dass der Speicherbedarf wächst

2

Jeder Thread ist ein anderer Ausführungskontext - ein Thread kann früher oder später beenden, können sie unterschiedliche Ressourcen mit unterschiedlichen Lebenszeiten und Speicherverwaltung benötigt, also jeder Thread sollte unabhängig verwaltet werden.

1

Weil sie auf diese Weise entworfen. Ich denke deine Frage ist, warum sie auf diese Weise entworfen haben. Ich bin nicht 100% sicher, aber ein möglicher Grund kann sein, dass das Teilen einer Ressource über Threads ihre Kosten hat. Bei jeder Änderung des gemeinsamen Pools muss jeder Thread die Sperre entsperren, wodurch die Leistung verringert wird. Eine Ressource sollte nur dann für mehrere Threads freigegeben werden, wenn diese Freigabe erforderlich ist, was bei Autorelease-Pools nicht der Fall ist. Die Verwendung eines dedizierten Autorelease-Pools wird besser funktionieren. Dies könnte ein möglicher Grund für diese Designentscheidung sein.

+0

Danke Taskinoor – Krishnan

+1

Gut geraten, aber unvollständig. Autorelease-Pools müssen per-Thread sein, da es keine Möglichkeit gibt, den Pool sicher zu leeren, ohne dass * alle Threads * in einem Zustand sind, in dem ihr Pool entleert werden könnte. Wenn * irgendein Thread * blockiert ist und auf Eingabe wartet, kann der Ablauf nicht passieren. Die Antwort von Jeffery ist richtig. – bbum

+1

@bbum, danke. Ich dachte nicht daran, den Pool zu leeren und ich stimme zu, dass Jefferys Antwort besser ist als meine. – taskinoor

Verwandte Themen