__block的替代语法?

时间:2013-06-07 16:25:26

标签: objective-c objective-c-blocks

我对__block变量的语法有疑问。我知道你可以在范围内的变量上使用__block,因此它在块内不是只读的。然而,在apple docs的一个位置,我看到了另一种选择:

  

“在块中使用时,定义范围中的变量默认为只读。如果需要更改此类变量的值,可以使用特殊语法:

int count = 0;
float cumulativeValue = 0.0;
UpdateElements( a, N, ^(float element){
    |count, cumulativeValue|
    float value = factor * element;
    ++count;
    cumulativeValue += value;
    return value;
} );
  

在此示例中,count和cumulativeValue在块内被修改,因此它们包含在块范围开头的逗号分隔的共享变量列表中。

这种语法似乎更清晰,我假设您可以修改未声明但仍在范围内的变量。但是,我还没有在其他任何地方看到这个,xCode编译器不喜欢我的基本块。这是合法的语法吗?

2 个答案:

答案 0 :(得分:45)

哇。很长一段时间没见过那种语法。

这是块开发过程中探索的各种句法结构之一。它最终被拒绝了,因为它在宣布意图时过于不精确,而且由此产生的行为会让人感到困惑。

考虑具有三个块的范围,其中两个块通过|a|将变量声明为readwrite。从范围顶部的int a = 5;声明中无法知道变量的值是否在块的某些范围内被读取。

同样,它会使编译器实现变得更加困难。 C中的传统是变量存储类型在声明时是固定的。支持这种语法会打破这种期望。

因此,决定使用类似于volatilestatic的存储类型修饰符。使用__block主要是因为__前缀大大减少了通过添加裸关键字而中断的代码量。

感谢您提出这个问题。提交的错误以及最终将修复和/或删除文档。

答案 1 :(得分:5)

| |语法的灵感来自Smalltalk,当然还有术语“块”。

正如bbum指出的那样,标记decl网站更为诚实w.r.t.非块使用,并且在建模时更符合C,因为它最终成为新的(C)对象“持续时间”。

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1451.pdf