質問

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つずつ追加したい場合は、返品値で「自動エレア」をスキップできますか?

-(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アレイ]は、この方法でスタックが完了した後に結果を継続的に使用するために、ディスパッチ_syncブロック内で安全ですか?

役に立ちましたか?

解決

いいえ、これは安全ではありません。問題は、キューに派遣すると、そのキューに自動化されたオブジェクトが、そのキューのnsautoreleasepool排水溝のときに収集されることです。これがいつになるかを制御できません。これについて考える適切な方法は、オートレリーズプールがキューで実行された瞬間に常に排出されると仮定することです。

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

someResultKeys = [[NSMutableArray alloc] init];

キューで、電話してください [someResultKeys autorelease] Dispatch_syncの後。

他のヒント

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

NSMutableArray* someResultKeys = [NSMutableArray array];

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top