1

UIがハングしないように、バックグラウンドで長時間実行される作業を行うためにいくつかのスレッドを切り離すiPhoneアプリケーションを構築しています。スレッドには、メモリ管理のために NSAutoreleasePool インスタンスが必要であることを理解しています。よくわからないのは、スレッド化されたメソッドが別のメソッドを呼び出すかどうかです-そのメソッドにも NSAutoreleasePool が必要ですか?

コード例:

- (void)primaryMethod {
    [self performSelectorInBackground:@selector(threadedMethod) withObject:nil];
}

- (void)threadedMethod {
    NSAutoreleasePool *aPool = [[NSAutoreleasePool alloc] init];

    // Some code here

    [self anotherMethod];

    // Maybe more code here

    [aPool drain];
}

- (void)anotherMethod {
    // More code here
}

私が尋ねる理由は、オブジェクトがプールを配置せずに自動解放され、「ちょうどリークしている」というエラーを受け取っているからです。

自動解放プールがまったく設置されていないという他の質問を見たことがありますが、なぜ自動解放プールが必要なのかを理解しています。threadedMethodで作成された自動解放プール (この例では)が で作成されたオブジェクトに適用されるかどうかを調べることに特に関心がありますanotherMethod

4

3 に答える 3

7

あなたの質問に答えるには、はい、anotherMethod は threadedMethod で作成した NSAutoreleasePool を使用しており、aPool が解放/ドレインされると、そこで自動解放されるものはすべて解放されます。

したがって、エラーがこのコードに直接起因している可能性は低いです (他に問題がある場合を除きます)。

_NSAutoreleaseNoPool にブレーク ポイントを設定し ([ブレークポイント] ウィンドウに名前で追加)、デバッガーでコードを実行すると、プールなしで autorelease が呼び出されるとコードが停止し、問題が解決するはずです。

于 2009-06-18T05:13:47.373 に答える
0

あなたの例では、はい、 NSAutoreleasePool の呼び出しが[self anotherMethod]内部にネストされているため、メソッド間で実行されています - (void)threadedMethod

  • Q: NSAutoreleasePool はメソッドをまたいでいますか?
  • A: それは依存します:
    1. はい、ネストされた呼び出し間で。
    2. 兄弟の呼び出し全体では、いいえ。

そして、何があっNSAutoreleasePoolても、親スコープがなくなると、インスタンス自体がスコープ外になります。-あなたの例では、の最後に-(void)threadedMethod { }

前述の記事 ( http://thegothicparty.com/dev/macos/nsautoreleasepool/ ) は、それについて非常に明確です。

于 2010-05-12T05:42:34.550 に答える
-1

自動解放プールは、anotherMethod に引き継がれます。ただし、スレッド化された関数が終了したら、[aPool ドレイン] の代わりに [aPool リリース] を呼び出す必要があります。これらはほぼ同等ですが、プールの解放により、プール内の他のすべてのオブジェクトに加えて、NSAutoreleasePool がそれ自体を解放します。ドレーンを呼び出した後にスレッド化された関数が終了しても、自動解放プールの保持カウントは +1 のままです。おそらく、「ちょうどリークしている」オブジェクトは aPool です!

編集:

Jim Puls は、リリースとドレインが同等であるという点で正しいです。Appleのドキュメントは、ガベージコレクションされていない環境ではそれらが同一であり、ガベージコレクションされた場合はドレインが優れていると明確に述べています。ドキュメントを読まなかった私のせいです!

これは、NSAutoreleasePools の一般的な概要を示す記事です。正しい方向を示すのに役立つはずです。自動解放プールの仮想スタックがあるため、オブジェクトが自動解放される場所に関係なく、アプリ内のあらゆる場所で最上位のプールが使用されます。

http://thegothicparty.com/dev/macos/nsautoreleasepool/

于 2009-06-18T03:28:43.147 に答える