すべてのスレッドに専用のプールが必要ですか?私はスレッドを使用するiPhoneアプリを書いています。スレッドにプールを置かないと、スレッドが漏れていると告げる。すべてのスレッドで独自の自動解放プールが必要ですか?
私がしたかったのは、スレッドよりも寿命の長いオブジェクトを保存することでした。どうしたらいいですか?
すべてのスレッドに専用のプールが必要ですか?私はスレッドを使用するiPhoneアプリを書いています。スレッドにプールを置かないと、スレッドが漏れていると告げる。すべてのスレッドで独自の自動解放プールが必要ですか?
私がしたかったのは、スレッドよりも寿命の長いオブジェクトを保存することでした。どうしたらいいですか?
いいえ、NSThread
にはそれぞれNSRunLoop
がありますが、それ自体はNSAutoreleasePool
ではありません。したがって、1つを作成する必要があります。大きな操作や多くの時間を要する操作を実行する場合は、実際にはメモリのフットプリントを低く抑えるためにプールを適宜設定する必要があります。
オブジェクトストレージはスレッドにまったくバインドされていないため、必要なすべてのスレッドからすべてのオブジェクトにアクセスできますが、オブジェクトへのアクセサがスレッドセーフではないため、アプリケーションが終了する可能性があります。しかし、これはあなたのアプリやコードに依存し、スレッドには依存しません。
JustSidが言ったことをちょっと説明してください。オブジェクトに対して自動解放が呼び出されると、現在のスレッドに関連付けられた自動解放プールが使用されます。 autoreleasepoolがスレッドに関連付けられていない場合、autoreleaseは機能せず、メモリリークが発生します。
最終的な答え:あなたのスレッドがオブジェクトを作成し、それらのスレッドを解放するためのオートリリースメカニズムを使用している場合、そのスレッドの自動解放プールを作成する必要があります。
スレッドに関連付けられたrunloopが必要ない場合は、自動解放プールを手動で作成する必要があります。オブジェクトの所有権を別のスレッドに移す場合は、オートリリースに頼るのではなく明示的にすることをお勧めします。それを保持するより寿命の長いスレッドで呼び出される何らかの「所有権の取得」メソッドを持っています。
NSAutoreleaseプールを安全に解放するにはどうすればよいですか?私がそれを取り除くと、漏れの苦情があります。 –
スレッドライフサイクルの終わりにのみ削除します。その間に何らかの理由でスレッドを削除する必要がある場合は、スレッドライフサイクルを再作成する必要があります。 – JustSid
@John - 自動解放プールを削除しないでください。自動解放されたオブジェクトを管理できるようにスレッド内で作成しますが、スレッドの実行が終了した後にハングアップしたいものは、手動で保持するか、手動で解放するか、 '-init'または' copy'を使用して初期化します。 –