Block是一种比较特殊的苹果官方推荐使用的数据类型,应用场景广泛
- 动画
- 多线程
- 集合遍历
- 网络请求回调
作用:用来保存某一段代码,可以在恰当的时候取出来调用,功能类似于函数
格式
返回值类型 (^block变量名)(形参列表) = ^{
};
//声明Block变量,
type (^BlockName) (type, type);
BlockName = ^(type name1, type name2){
};
//调用
BlockName(name1,name2);
先借用typedef给Block定义一个变量名
应用场景
- 当发现代码前面和后面一样的时候,可以使用Block
void fun(^BlockName())
{
NSLog(@"1");
BLockName();
NSLog(@"3");
}
void fun1()
{
fun(^{NSLog(@"3");});
}
打印:1
2
3
注意:
- Block可以访问外部变量
- Block可以定义和外界定义的变量,如果有和外面同名的变量,在Block中访问的是Block的变量
- 默认情况下,不可以在Block中修改外界变量的值
因为Block中的变量和外界的变量不是同一个变量
Block访问到了外界的变量,Block会将外界的变量拷贝一份到堆内存中
- 如果加上__block之后就是地址传递,所以可以在Block中修改外界的值
- 默认情况下Block储存在栈中,如果Block进行一个copy操作,Block会转移到堆中
- 如果Block在栈中,访问了外界的对象,那么不会对对象进行retain操作
- 如果Block在堆中,Block中访问了外界的对象,那么会对外界对象进行一次retain
- 如果在Block中访问了外界对象,一定要个对象加上__block,只要加上了__block,Block在堆中也不会对对象进行retain