5

iOSアプリ開発ではNSAutoreleasePool、後でオブジェクトの所有権を放棄するために使用しています。

しかし、なぜそれを異なるスレッド間で共有できるのでしょうか?

新しいスレッドを使用したいのに、なぜ新しい自動リリースプールを作成する必要があるのですか?

編集:

taskinoorが述べたように、私の質問は、なぜこれが各スレッドが個別の自動リリースプールを持つように設計されているのかということでした。

4

4 に答える 4

5

マルチスレッド自動解放プールの設計上の課題は、それらをいつ排出するかです。オブジェクトがまだ使用されている間にプールを空にすると、クラッシュします。スレッドごとに、実行ループの外にいるとき、つまり自動解放されたオブジェクトが排出される可能性があるときを簡単に見分けることができます。マルチスレッドの状況では、実行ループの最後でスレッドを同期する必要があります。これにより、スレッドを安全に排出できるようになります。このようにトレッドを同期させることは悪い考えです。多くのアイドル時間が発生し、プログラムの速度が低下します。

于 2012-08-04T13:22:52.230 に答える
2

各スレッドは異なる実行コンテキストです。1つのスレッドは遅かれ早かれ終了する可能性があり、異なるライフタイムとメモリ管理のニーズを持つ異なるリソースを使用する可能性があるため、各スレッドは個別に管理する必要があります。

于 2012-08-04T13:05:10.610 に答える
1

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

于 2012-08-04T13:06:44.557 に答える
0

Cocoaのapplesメモリ管理ガイドによると、自動解放プールはスレッド間で共有されているとは思いません。各スレッドには独自の自動解放プールのスタックがあります。

作成またはデタッチするスレッドの自動解放プールを作成しないと、自動解放機能が機能しないため、メモリフットプリントが増加します。

于 2012-08-04T13:04:05.727 に答える