Blocks 是什么?
如果把OC看作C语言的超集,那么Blocks就是C语言的扩充功能。用一句话来概括Blocks:带有自动变量(局部变量)的匿名函数。
匿名函数,就是不带有名称的函数。
Blocks的基本语法
:^ 返回值类型 参数列表 表达式
^ int (int count) {return count +1;}
上面这是Blocks的基本方式。Blocks同时也可以省略一些项目。
首先是可以省去返回值类型:
^(int count){return count+1;}
此时,编译器将根据return语句的类型,返回Int型返回值。
其次,如果不实用参数,参数列表也可以省去。
^ void(void){printf();}
可以省略成下面的形式:
^{printf();}
也就是: ^ 表达式
Blocks类型变量
Blocks 变量可以看作将声明函数指针类型变量的”*”变为”^”。因此,Blocks变量可以作为以下参数:
- 自动变量
- 函数参数
- 静态变量
- 静态全局变量
- 全局变量
int (^bk)(int) = ^(int count)={return count+1;}
int (^bk)(int) = bk;
上面将Block语法生成的Block变量赋值给bk,同样因为类型一样,所以bk可以赋值给bk1;
Block类型变量可完全像通常的C语言变量一样使用,因此也可以使用指向Block类型变量的指针,即Block指针类型变量。
typedef int (^blk_t) int ;
blk_t blk = ^(int count){return count+1;}
blk_t *blkptr = &blk;
(*blkptr)(10);
截获自动变量
先来看一段代码 :
int dmy = 256;
int val= 10;
const char *fmt = "val = %d\n";
void (^blk)(void) = ^{printf(fmt,val);};
val =2;
fmt = "this is test val = %d\n";
blk();
执行结果
val = 10
Program ended with exit code: 0
可以看到并不是输出 this is test val = 2
因为在执行到blocks的时候,block保存了val的瞬值,即使改变了blocks使用的自动变量,也不会影响Block执行时自动变量。
如果要改变局部变量,要在变量前加上 __block。
在Objective-c 高级编程中 还讲解在block的实现方法,这里才疏学浅没能很透彻的明白,还需要继续努力。