1

次のようなメソッドがあります。

- (void)doSomething:(void(^)(MyItem *item))optionalBlock {

    // 1. Do the regular stuff with the item
    item.regularStuff = @"something_regular";

    // 2. Run the optional block
    // which may or may not make some extra modifications to the item
    if (optionalBlock) optionalBlock(item);

    // 3. Save the modified item into the Core Data
    // etc

}

私はこのようにどちらかを呼び出す予定です

[self doSomething:nil];

または:

[self doSomething:^(MyItem *item) {

    // Make some extra modifications to the item before it’s saved
    item.custom = @"custom";

}];

ステップ 3 で、メソッドと (場合によっては) オプション ブロックの両方によって既に変更されたものを常に取得すると仮定しても安全itemですか、それとも、ブロックがいつ終了したかを正確に知るために何らかの方法を実装する必要がありますか?そこから続行できるように実行していますか?

4

2 に答える 2

3

安全です。特別なチェックは必要ありません。

于 2012-12-27T05:04:42.257 に答える
2

はいといいえ。

はい、安全です。ブロックに を変更するためのシーケンシャル コードのみが含まれている場合、itemこれらの変更はすべて、コントロールがメソッドに戻るまでに完了しますdoSomething

ただし、メソッドの呼び出し元に任意のブロックを渡すことを許可すると、いつ何を行うかわかりません。タイマーを設定したり、スレッドを生成したり、 を使用dispatch_asyncしたり、返されるまでに何らかの意味で真に「完了」していない可能性のある他の多くのことを行うことができます。あなたはここで車のキーを手渡しています。

実際、これは言語の範囲を超えたものであり、API のドキュメントで定義するコントラクトの種類に関するものです。呼び出し元がそのブロックの実行中にのみオブジェクトを変更するようにしたい場合は、それらに伝えてください。それがあなたが彼らに期待することであり、あなたの API が他の方法で動作することを期待しないでください。

于 2012-12-27T06:43:18.087 に答える