我对__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编译器不喜欢我的基本块。这是合法的语法吗?
答案 0 :(得分:45)
哇。很长一段时间没见过那种语法。
这是块开发过程中探索的各种句法结构之一。它最终被拒绝了,因为它在宣布意图时过于不精确,而且由此产生的行为会让人感到困惑。
考虑具有三个块的范围,其中两个块通过|a|
将变量声明为readwrite。从范围顶部的int a = 5;
声明中无法知道变量的值是否在块的某些范围内被读取。
同样,它会使编译器实现变得更加困难。 C中的传统是变量存储类型在声明时是固定的。支持这种语法会打破这种期望。
因此,决定使用类似于volatile
或static
的存储类型修饰符。使用__block
主要是因为__
前缀大大减少了通过添加裸关键字而中断的代码量。
感谢您提出这个问题。提交的错误以及最终将修复和/或删除文档。
答案 1 :(得分:5)
| |语法的灵感来自Smalltalk,当然还有术语“块”。
正如bbum指出的那样,标记decl网站更为诚实w.r.t.非块使用,并且在建模时更符合C,因为它最终成为新的(C)对象“持续时间”。