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";

}];

是否可以安全地假设在第三步我总是会得到item已经被方法和(可能)可选块修改的,或者我是否需要实现某种方法来准确找出块何时完成执行所以我可以从那里继续?

4

2 回答 2

3

它是安全的。您不需要任何特殊检查。

于 2012-12-27T05:04:42.257 回答
2

是和不是。

是的,这是安全的,因为如果块仅包含用于修改您的 的顺序代码item,则所有这些修改将在时间控制返回您的doSomething方法时完成。

但是,如果您允许方法的调用者传入任意块,则不知道它会做什么以及何时执行。它可以设置计时器、产生线程、使用dispatch_async或做任何其他事情,这可能会导致它在某种意义上在它返回时还没有真正“完成”。你在这里交出车钥匙——没有什么能阻止来电者兜风。

确实,这是超出语言范围的事情,更多关于您在 API 文档中定义的合同类型:如果您希望调用者仅在执行该块期间修改对象,只需告诉他们这就是您期望他们做的事情,并且不期望您的 API 以其他方式工作。

于 2012-12-27T06:43:18.087 回答