2011-03-06 4 views
5

iOS/CocoaTouchでは、メソッド内にNSAutoreleasePoolの新しいインスタンスを作成するコードがよく見られます。私は最近、NSOperation内で1つを見ました。NSAutoreleasePool。新しい自動解放プールを作成するのはいつ適切ですか?

NSAutoreleasePoolの新しいインスタンスを設定する根拠は何ですか?これは、main.mで作成された既存のリリースプールに単純に頼っているのはなぜでしょうか?

おかげで、
ダグ

答えて

6

あなたはいつでもあなたは、新しい自動解放プールを使用することができますが、それは必ずしも有益ではありません。新しいスレッドを開始するたびに、またはそのスレッドで自動リリースされたオブジェクトがリークするたびに必要です。また、多数のオブジェクトを作成して自動解放する方法で、新しい自動解放プールを作成することも一般的です。たとえば、50個の反復ごとに10個のオブジェクトを作成したループがある場合は、そのメソッドの自動解放プールを作成することを検討する必要があります(ループの一部ではない場合)。

+0

ローカルの自動解放プールはいつ有効ですか。私は、きめ細かいmems管理のためのものを作成するための動機を集めます。また、新しいスレッド用に新しい自動解放プールを作成する必要があります。 NSOperationsではこれは本当ですか?私は狂信的なテスターであり、ローカルの自動解放プールがない現在のNSOperationsではmemのリークは見られません。 – dugla

+0

@dugla NSOperations用に作成する必要があるかどうかはわかりません。オブジェクトがプールなしでオートレリースされると、コンソールにメッセージが出力されるので、必要な場合はそれを知る必要があります。余分な割り当てを追加してプロセッササイクルを奪取するため、多くのオブジェクトを作成しないとプールを作成することは有効ではありません。他のオブジェクトがそれを使用しないので、それが存続中にobjective-cオブジェクトを使用しない限り、それはどんな利点もありません。 – ughoavgfhw

3

プールがまだ存在しない場合(新しいスレッドなど)、または実行ループ内のプールが十分でない場合(多くの場合に実行されるループ内に自動解放されたオブジェクトを作成する場合)反復)、または作成した自動リリースされたオブジェクトが最終的にリリースされるときの制御を強化する必要がある場合です。

1

私はiOS 4.3でテストしました。performSelectorInBackgroundを実行するときは、独自の自動解放プールを作成する必要があります。 NSOperationまたはdispatch_asyncを使用するときに作成する必要はありません。

iOS> = 5.0のように見えますが、performSelectorInBackgroundを使用しても自動的に自動解放プールが作成されるため、独自の自動解放プールを作成する必要があります。

変更内容が見つかりませんでした。

関連する問題