关于iOS的Block类型截获自动变量值
Blocks是C语言的扩充功能,可以这样描述Blocks:带有自动变量(局部变量)的匿名函数。很明显,匿名函数就是不带名称的函数。下面主要说得是“带有自动变量(局部变量)”,这点在Blocks中表现为“截获自动变量值”。下面上代码:
int main(int argc, const char * argv[]) { @autoreleasepool { int value0 = 1; int value1 = 2; void (^myBlock)(void) = ^{ NSLog(@"value0:%d value1:%d", value0, value1); }; value0 = 10; value1 = 20; myBlock(); //[13684:2000910] value0:1 value1:2 } return 0; }
在上面的代码中,Block语法的表达式使用的是在Block声明之前的变量value0和value1。Blocks中,Block表达式截获所使用的自动变量的值,保存的是该自动变量的瞬间值,所以即使在声明完Block之后又修改了value0和value1的值,在Block表达式中这两个变量的值还是修改之前的,这就是自动变量值的截获。