关于objective c:__block的替代语法?

Alternative syntax to __block?

我对__block变量的语法有疑问。我知道您可以在作用域中的变量上使用__block,这样它就不会在块内是只读的。然而,在苹果文档中的一个地方,我看到了另一种选择:

"Variables in the defining scope are read-only by default when used in a block. If you need to change the value of such a variable, you can use a special syntax:

1
2
3
4
5
6
7
8
9
int count = 0;
float cumulativeValue = 0.0;
UpdateElements( a, N, ^(float element){
    |count, cumulativeValue|
    float value = factor * element;
    ++count;
    cumulativeValue += value;
    return value;
} );

In this example, count and cumulativeValue are modified inside the block, so they are included in comma-separated list of shared variables at the beginning of the block scope.

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


真的。很久没见过这种语法了。

这是块开发过程中探索的各种句法结构之一。它最终被拒绝了,因为它在声明意图时太不精确,结果的行为会令人困惑。

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

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

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

谢谢你的邀请。错误已归档,文档最终将被修复和/或删除。


语法受到smalltalk的启发,当然,术语"block"也是如此。

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

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