web-dev-qa-db-ja.com

自動解放プールを使用する理由

Mainメソッドで作成された自動解放プールがあり、自動解放メッセージを受信するすべてのオブジェクトがこのプールに格納され、プールがなくなると解放されることを知っています。

ただし、メモリリークを回避し、アプリがクラッシュするのを防ぐために、オブジェクトの自動解放を回避すると常に言われています。

では、なぜ、どのような条件でautoreleasepoolを使用する必要があるのでしょうか。

Appleのドキュメントでは、スレッドを使用しているときにそれらを使用する必要があると示唆されているため、スレッドの最初に自動解放プールを作成し、スレッドの最後にそれを排出する必要がありますが、完全に自動解放オブジェクトを作成していない場合はどうなりますかスレッドの場合、その状態では、スレッドの先頭に自動リリースプールを作成する必要もあります。

私の混乱を解消してください。ありがとう。

30
Aisha

あなたの仮定は正しいです。特定のスレッドが自動解放されたオブジェクトを使用しないようにすることができる場合、そのスレッドは自動解放プールを必要としません。

自動リリースプールを回避することは悪いアドバイスです。コインには2つの側面があります。自動解放されたオブジェクトを使用すると、(ほとんどのシナリオでは重要ではありませんが)ある程度のオーバーヘッドが発生しますが、可能な場合は回避する必要があります。特に、メソッドに複数の出口がある場合、または例外が発生する可能性がある場合、自動解放はメモリリークを回避し、コードをよりクリーンにするのに役立ちます。

ただし、これは、呼び出すフレームワークを含め、そのスレッドで自動解放を使用できるものがないことを意味することに注意してください。これが当てはまる状況があります。たとえば、古典的な生産者/消費者シナリオなどです。オブジェクトを作成し、それらをメインスレッドのrunloopにディスパッチし、その結果、オブジェクトをメインスレッドのautoreleasepoolに登録できるプロデューサーがあります。

一般に、自動リリースプールなしで(単純で長時間実行される計算以外に)重要な作業が実行されるスレッドを作成することはお勧めしません。

20