iOS/CocoaTouch では、メソッド内で NSAutoreleasePool の新しいインスタンスを作成するコードをよく見かけます。私は最近、NSOperation 内で 1 つを見ました。
NSAutoreleasePool の新しいインスタンスを設定するための基本ルールは何ですか? main.m で作成された既存のリリース プールに単純に依存するよりも、なぜこれが望ましいのでしょうか?
ありがとう、
ダグ
iOS/CocoaTouch では、メソッド内で NSAutoreleasePool の新しいインスタンスを作成するコードをよく見かけます。私は最近、NSOperation 内で 1 つを見ました。
NSAutoreleasePool の新しいインスタンスを設定するための基本ルールは何ですか? main.m で作成された既存のリリース プールに単純に依存するよりも、なぜこれが望ましいのでしょうか?
ありがとう、
ダグ
新しい自動解放プールはいつでも使用できますが、常に有益であるとは限りません。新しいスレッドを開始するか、そのスレッドで自動解放されたオブジェクトがリークされるたびに必要です。また、多数のオブジェクトを作成して自動解放する方法で、新しい自動解放プールを作成することも一般的です。たとえば、50 回の反復ごとに 10 個のオブジェクトを作成するループがある場合、ループの一部としてではなくても、反復ごとに新しいプールが作成されるように、そのメソッドの自動解放プールを作成することを検討する必要があります。
独自のプールが存在しない場合 (新しいスレッドなど)、または実行ループ内のプールが不十分な場合 (多くの反復で実行されるループ内で自動解放されたオブジェクトを作成する)、または作成した自動解放されたオブジェクトが最終的にいつ解放されるかをより詳細に制御したい場合。
私は iOS 4.3 でテストしましたが、performSelectorInBackground を実行するときに独自の自動解放プールを作成する必要があります。NSOperation または dispatch_async を使用する場合は作成する必要はありません。
iOS >= 5.0 では、performSelectorInBackground を使用してもシステムが自動解放プールを自動的に作成するようです。そのため、独自の自動解放プールを作成する必要がある場合を見つけることができませんでした。
ただし、その変更が文書化されているのを見つけることができませんでした。