这是来自苹果块编程,谁能告诉我这是什么意思
封闭词法范围的局部堆栈(非静态)变量被捕获为 const 变量。
假设你有:
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);
这意味着如果您在定义块的范围内声明了一个局部变量,那么您可以在块中引用该变量,但您无法更改其值,也无法看到外部对其值所做的任何更改。
//-- 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
限定符进行对比,以便能够修改该变量的值。