2012-08-04 5 views
5

iOSアプリケーションの開発では、NSAutoreleasePoolを使用して、後でオブジェクトの所有権を放棄します。スレッドごとにNSAutoreleasepoolを使用する必要があるのはなぜですか?

しかし、なぜそれは異なるスレッド間で共有できますか?

なぜ私は新しいスレッドを使用したいときに新しい自動解放プールを作成する必要がありますか?

EDIT:

taskinoorは私の質問に述べたように、これは、各スレッドが別々のautoreleasepoolを持つべきであるように設計されている理由でした。

+1

[この質問はあなたの質問に非常に関係しているようです](@stackoverflow.com/questions/4547652/does-every-thread-need-its-own-autorelease-pool) –

+1

あなたは '@ NSAutoreleasePool'の代わりにautoreleasepool {...} 'を使用します。ドキュメントによると、より効率的です。 ARCに移行する場合は必須です。 –

+0

私はあなたがその編集を必要とした理由を知らない、私の答えはそれの理由を説明する:) –

答えて

5

マルチスレッド自動解放プールの設計課題は、それらを排水するときです。オブジェクトがまだ使用されているときにプールを排水すると、クラッシュします。スレッドごとに、実行ループの外にあるとき、したがって自動解放されたオブジェクトが排除される時点を容易に把握できます。マルチスレッドの状況では、実行ループの最後にスレッドを同期させる必要があるため、スレッドを安全に排除することができます。このように同期したトレッドは悪い考えです。アイドル時間が長くなり、プログラムが遅くなります。

+1

さらに進んでください。ネットワーク、スレッド状態、その他のI/Oを待っているスレッドがブロックされている場合は、プール全体を排水できませんでした。 – bbum

0

私は自動解放プールは、あなたが作成したスレッドまたはのための自動解放プールを作成しない場合、各スレッドは、自動解放プール

を独自のスタックを持っているココアにapples memory management guideによると、スレッド間で共有されているとは思いませんデタッチすると、自動解放機能は機能しませんので、メモリのフットプリントは増加します

2

各スレッドは異なる実行コンテキストです.1つのスレッドが遅かれ早かれ終了する可能性があり、寿命とメモリ管理のニーズが異なるため、スレッドは独立して管理する必要があります。

1

このように設計されているためです。私はあなたの質問がなぜこのように設計されたのかと思います。私は100%確信しているわけではありませんが、1つの理由はスレッド間でリソースを共有することにコストがかかることです。共有プールを変更するたびに、各スレッドはロックを解除してパフォーマンスを低下させる必要があります。自動解放プールの場合には当てはまらない共有が必要な場合にのみ、複数のスレッド間でリソースを共有する必要があります。専用の自動解放プールを使用するとパフォーマンスが向上します。これは、この設計上の決定の理由の1つである可能性があります。

+0

ありがとうTaskinoor – Krishnan

+1

良い推測、しかし不完全です。自動解放プールはスレッドごとにする必要があります。なぜなら、すべてのスレッド*がプールを排水できない状態でプールを安全に排水する方法がないからです。 *スレッド*が入力を待ってブロックされていると、ドレインが発生しなくなります。ジェフリーの答えは正しい。 – bbum

+1

@bbum、ありがとう。私はプールを排水することについて考えなかったし、ジェフリーの答えが私のものよりも良いことに同意する。 – taskinoor

関連する問題