2010-12-28 3 views

Antwort

7

Nein, jeder NSThread hat seine eigene NSRunLoop, aber keine eigene NSAutoreleasePool. Daher müssen Sie einen erstellen, und wenn Sie eine große Operation oder eine Operation ausführen, die viel Zeit benötigt, sollten Sie den Pool von Zeit zu Zeit wirklich niedrig halten.

Objektspeicher ist nicht an einen Thread gebunden, Sie können auf jedes Objekt aus jedem Thread zugreifen, aber es ist möglich, dass der Accessor auf das Objekt nicht threadsicher ist und somit Ihre App zerstört. Dies hängt jedoch von Ihrer App und Ihrem Code und nicht von Threads ab.

+0

Also wie kann ich den NSAutorelease-Pool sicher freigeben? Wenn ich es entferne, gibt es Beschwerden über Lecks. –

+0

Entfernen Sie es erst am Ende des Threads-Lebenszyklus, in der Zwischenzeit müssen Sie es neu erstellen, wenn Sie es aus irgendeinem Grund entfernen müssen. – JustSid

+0

@John - Sie sollten den Autorelease-Pool nicht entfernen. Erstellen Sie es innerhalb des Threads, so dass es automatisch freigegebene Objekte verwalten kann, aber alles, was Sie nach dem Ausführen des Threads behalten möchten, sollte manuell beibehalten (und später manuell freigegeben) oder mit "-init" oder "copy" initialisiert werden. –

3

Um ein bisschen genau zu sagen, was JustSid sagte: Wenn Autorelease für ein Objekt aufgerufen wird, wird der Autoreleasepool verwendet, der dem aktuellen Thread zugeordnet ist. Wenn also kein Autoreleasepool mit Ihrem Thread verknüpft ist, funktioniert die Autorelease nicht, was zu einem Speicherleck führt.

Die endgültige Antwort lautet: Wenn Ihr Thread Objekte erstellt und auf den Autorelease-Mechanismus zählt, um sie freizugeben, müssen Sie einen Autorespulepool für diesen Thread erstellen!

+0

Ich versuche das Gegenteil, um sicherzustellen, dass sie nicht in den Autorelease-Pool gehen. –

+1

@John Smith: Aber Apples interne Funktionen nutzen auch die Autorelease-Pools, so dass es wirklich schwer ist, sie zu vermeiden. – JustSid

+0

Genau! Deshalb erstelle ich immer einen für jeden Thread, außer wenn ich sicher bin, dass ich ihn nicht brauche. – VdesmedT

1

Wenn Sie keinen mit Ihrem Thread verbundenen Runloop benötigen, müssen Sie manuell einen Autorelease-Pool erstellen. Ich würde vorschlagen, dass Sie, um das Eigentum eines Objekts auf einen anderen Thread zu übertragen, es explizit machen, anstatt zu versuchen, sich auf Autorelease zu verlassen; habe eine Art von "Take Ownership" -Methode, die einen längerlebigen Thread aufgerufen hat, der sie behält.