0

这是来自苹果块编程,谁能告诉我这是什么意思

封闭词法范围的局部堆栈(非静态)变量被捕获为 const 变量。

4

2 回答 2

3

假设你有:

int i = 5; // in stack

然后在块中你有:

...
i++; // can't do that, because i now inside the block is a const
...

您将 __block 添加到i声明中,以便能够i像这样更改块内的值:

__block int i = 5; // remove __block and see the error

void (^myBlock)(void) = ^{
    NSLog(@"[inside block] i = %i", i); // no error even without __block
    i++; // error here without __block
};

myBlock();

NSLog(@"[outside block] i = %i", i);
于 2012-10-25T08:44:52.097 回答
1

这意味着如果您在定义块的范围内声明了一个局部变量,那么您可以在块中引用该变量,但您无法更改其值,也无法看到外部对其值所做的任何更改。

//-- this is the "Stack (non-static) variables local to the enclosing lexical scope"
int x = 123;

void (^printXAndY)(int) = ^(int y) {

   printf("%d %d\n", x, y);             //-- you can use x inside the block
};

x 表现为一个 const 变量,即它的值在定义块的那一刻被冻结,您不能修改它。

将此与使用__block限定符进行对比,以便能够修改该变量的值。

于 2012-10-25T08:44:56.950 回答