blocks是带有局部变量的匿名函数。所谓匿名函数,就是不带有函数名称的函数。
// 第一种
^ int(int a) {
};
// 第二种,省略返回值
^(int a) {
};
// 第三种,如果没有输入参数
^{
};
int(^blk)(int);
void(^blk)();
用typedef定义blocks
typedef int(^blk_t)(int);
blk_t blk = ^(int count) { return count + 1;};
int main() {
int val = 10;
void (^blk)(void) = ^{ printf("%d",val); };
val = 2;
blk();
return 0;
}
输出结果是10,而不是2. 原因就在于在代码级别,blocks就已经截获了变量值,并保持了下来,而不受后面代码的影响。
如果想在blocks中,给blocks外面的变量赋值,必须用__block申明该变量。
int __block val = 1;
void (^blk)(void) = ^{
val = 10;
}
blk();
printf("val = %d",val);
输出结果是10
--EOF--