2011-06-18 7 views
28

メインメソッドで作成された自動解放プールがあり、自動解放メッセージを受け取るすべてのオブジェクトがこのプールに格納され、プールが空になったときに解放されることはわかっています。なぜオートリリースプールを使用しますか?

しかし、メモリリークやアプリのクラッシュを避けるため、オブジェクトの自動リコリナイズを避けることが常に言われています。

なぜ、どのような条件でオートリリープールを使用する必要がありますか?

アップルのドキュメントでは、スレッドを使用しているときにスレッドを使用する必要があると提案しています。自動解放プールを作成する必要があります。スレッドの最後には自動解放プールを作成する必要がありますオブジェクトを完全なスレッドに入れ、その状態でスレッドの先頭に自動解放プールを作成する必要もあります。

私の混乱を解消してください。 Thanx。

答えて

19

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

自動回収プールを避けることは悪いアドバイスです。コインには2つの面があります。 autorelease'dオブジェクトを使用すると、できるだけ避ける必要があるオーバーヘッドが(ほとんどのシナリオでは重要ではありませんが)一定量のオーバーヘッドを持ちます。特にメソッドへの終了が複数ある場合や例外が発生した場合、自動リリースはメモリリークの回避に役立ち、コードクリーナーを作成します。

これは、呼び出し可能なフレームワークを含め、そのスレッドがautoreleaseを使用することはできないことに注意してください。典型的なプロデューサ/コンシューマシナリオのような状況があります。プロデューサにはオブジェクトを作成し、メインスレッドのrunloopにディスパッチし、メインスレッドのautoreleasepoolに登録することができます。

一般的に、自動解放プールを使用せずに重要な作業が実行されるスレッドを作成することは推奨されません。

+0

自動解放プールなしでスレッドを作成するとメモリリークが発生しますか? –

+2

はい、スレッド上のオブジェクトを自動解放し、プールがない場合は、リークが発生します。 –

+0

それは論争の的です。 http://stackoverflow.com/questions/12575010/using-arc-is-it-fatal-not-to-have-an-autorelease-pool-for-every-thread –

関連する問題