__block的替代语法?

pk-*_*-nb 33 objective-c objective-c-blocks

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

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

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

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

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

bbu*_*bum 45

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

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

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

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

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

谢谢你问这个.提交错误并最终修复和/或删除文档.

  • 如果文档人员无法弄清楚如何连贯地解释某些内容,那么这肯定表明设计存在严重缺陷,因此他们在设计过程的早期就参与其中.该文档最初可能是为WWDC首次公布的. (4认同)

小智 5

| | 语法的灵感来自Smalltalk,当然,也就是术语"块".

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

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