一、 Blocks是C语言的 扩展功能:带有自动变量(局部变量)的匿名函数。
C语言中用到的变量:自动变量(局部变量)、静态变量、静态局部变量、全局变量、函数参数
函数多次调用之间能够传递值的变量有:静态变量(静态局部变量)、静态全局变量、全局变量。因为在整个程序中,一个变量总保持在一个内存区域,虽然多次调用但是该变量值总能保持不变,在任何时候以任何状态调用,使用的都是同样的变量值。
二、Blocks模式
1、Block语法:^ 返回值类型 (参数列表) {表达式}
Block类型变量:
a 通过typedef声明blk_type类型变量
typedef int (^blk_type)(int);
blk_type blk_1;
b 一般声明Block类型变量:
int (^blk_1)(int);
将Block赋值为Block类型变量:
int (^blk_1)(int) = ^(int count){return count+1;};
int (^blk_2)(int);
blk_2=blk_1;
Block类型变量与C语言变量一样,可以作为:自动变量、静态变量、静态局部变量、全局变量、函数参数
(函数返回值、指向Blcok类型的变量即Block的指针类型变量)。
2、截获自动变量值
“带有自动变量值”在Blocks中表现为“截获自动变量值”:即保存该自动变量的瞬间值,保存后就不能改写该值
3、__block说明符
若想在Blocks语法表达式中将 值 赋给在Blocks语法外声明的 自动变量,需要在该自动变量上附加__block说明符。
4、截获的自动变量(非OC对象、OC对象、数组)
a 将值赋值给Block中截获的自动变量,会产生编译错误。
b 截获OC对象,对OC对象赋值会产生编译错误( obj=obj ),但是使用OC对象就不会产生编译错误( [obj addObject:**] )
c 在Blocks中截获自动变量的方法并没有实现对C语言数组的截获,可以使用指针解决该问题。
const char text[]="hello";
void(^blk)(void)=^{printf("%c\n",text[2]);}
以上代码报错。修改为:
const char *text="hello";
void(^blk)(void)=^{printf("%c\n",text[2]);}
三、Blocks实现
1、Block的实质:一个Block是一个结构体实例,结构体中有isa指针,指向所属类,说明:Block是OC对象。
注:所属类也是一个结构体实例,结构体中有isa指针,指向其父类-----一级一级直到超类
“OC中由类生成对象”:意味着“生成由该类生成的对象的结构体实例”,生成的各个对象,即由该类生成的对象的各个结构体实例,结构体中成员变量isa指针保持该类的结构体实例指针。
2、截获自动变量值
“截获自动变量值”:在执行Block语法时,Block语法表达式所 使用 的 自动变量值 被保存到Block的结构体实