1

dispatch_sync ブロック中に内容が設定された配列を返したいと思います。

私がよく目にするコードは次のようなものです。

-(NSArray *)getSomeLockedList {

    __block NSArray *resultList;

    dispatch_sync(myQueue, ^{   
       // copy contents of my ivar NSMutableArray into return variable  
       resultList = [ivarContentList copy]; 
    });

    // add auto-release since a 'copy' was done within block
    return [resultList autorelease]; 
}

配列全体のコピーではなく、1 つずつ追加したい場合、戻り値の「autorelease」をスキップできますか?

-(NSArray *)getSomeLockedList {

    __block NSArray *someResultKeys; // is it ever safe to do the alloc here?

    dispatch_sync(myQueue, ^{       
       someResultKeys = [NSMutableArray array];

    for (id entry in ivarContentList) {

          // do some work on entry instance
          [someResultKeys addObject:entry];     
       }        
    });

    return someResultKeys; // autorelease not necessary?
}

[NSMutableArray array] の割り当ては、このメソッドのスタックが完了した後に結果を継続して使用するために、dispatch_sync ブロック内で安全ですか?

4

2 に答える 2

3

いいえ、これは安全ではありません。問題は、キューにディスパッチすると、そのキューの NSAutoreleasePool が排出されるときに、そのキューで自動解放されたすべてのオブジェクトが収集されることです。これがいつになるかを制御することはできません。これについて考える適切な方法は、ブロックがキューで実行を終了した瞬間に自動解放プールが排出されると常に想定することです。

あなたの場合にこれを処理する正しい方法は、使用することです

someResultKeys = [[NSMutableArray alloc] init];

[someResultKeys autorelease]キューに入れてから、dispatch_sync の後に呼び出します。

于 2011-01-10T21:27:11.283 に答える
0

これは、書くだけで __block 変数を回避する方がはるかに簡単です。

NSMutableArray* someResultKeys = [NSMutableArray array];

ブロックの外。しかし、私はdispatch_syncについて疑問に思います。ブロックの実行が完了するまで、dispatch_sync が待機することをご存知ですか? (シリアル キューの場合は、実行が完了する前のすべてのブロックも意味します)。コードを直接呼び出さない正当な理由はありますか?

于 2014-03-20T18:03:37.423 に答える