iOS开发——Block详解
1. Block是什么
- 代码块
- 匿名函数
- 闭包——能够读取其他函数内部变量的函数
- 函数变量
- 实现基于指针和函数指针
- 实现回调的机制
Block是一个非常有特色的语法,它可以把一个代码块作为一个变量来保存,也可以通过函数传递变量,然后让其他的对象来执行这一代码块。可以保存传递并在其他地方执行的代码块,这是我对Block的理解,也是我觉得Block最吸引我的地方。
2. 怎么写Block
官方写法
/**直接定义——返回Block指针
* ^返回类型<可省略>(参数类型 参数)<没有参数可省略>{
* 代码块;
* };
*/
^int(int a){
return a;
};
/**使用Block——返回Block返回值
* Block(参数)
*/
^int(int a){
return a;
}(5);
/**声明定义Block变量
* 返回类型 (^变量名)(参数类型);
*/
int (^example)(int);
example = ^(int a){
return a;
};
最建议写法
/**类型声明定义Block变量
* typedef 返回类型 (^Block名)(参数类型);
*/
typedef int (^Example)(int);
Example eg = ^(int a){
return a;
};
eg(5);
3. Block存在的坑
- 默认Block只能访问局部变量的值,但是不能修改局部变量的值
- 要修改局部变量的值需要在定义变量前面加上
__block
- 要修改局部对象的值需要在定义对象前面加上
__weak
- 全局变量的机制跟局部变量一样,默认传入时只会Copy源变量,对它修改不会起到任何作用,只有用
__block
或者__weak
修饰的变量操作才有意义 - 块是在栈上分布的,如果要保留块,就必须使用copy
@property (nonamatic, copy) ABlock eg;