iOS Block
blocks 是 C 语言的扩充功能。blocks 是带有自动变量(局部变量)的匿名函数。
截获自动变量 int main() { int dmy = 256; int val = 10; const char *fmt = "val = %d\n"; void (^blk)(void) = ^{ printf(fmt,val); }; val = 2; fmt = "These value were changed. val = %d\n"; blk(); return 0; } 结果:val = 10
分析:block 语法的表达式使用的是它之前声明的自动变量 fmt 和 val。block 表达式截获所使用的自动变量的值为瞬间值。因为 block 表达式保存了自动变量的值(截获),所以在执行 block 语法后,即使改写了 block 中使用的自动变量的值也不会影响 block 执行的结果。
需要在 block 中修改一个变量的值,需要使用 __block 说明符。
block 的实质 block 实际上是作为极普通的 C 语言源代码来处理的。通过支持 block 的编译器,含有 block 语法的源代码转换为一般 C 语言编译器能够处理的源代码,并作为极为普通的 C 语言代码被编译。