1、block的声明
void(^block)();
2、block的三种定义
三种方式 = ^(参数){
}
a.void(^block1)() = ^(){
}
//如果没有参数 参数可以隐藏。如果有参数,定义的时候,必须要写参数,而且必须要有参数变量名
b.
void(^block2)() = ^{
}
void(^block2)(int) = ^(int a) {
}
//bock返回值可以省略,不管有没有返回值都可以省略
c.int(^block3)() = ^int{
return 3;
}
3、bolck的用处
a. 封装模型方法
b.传值
传值
只要能拿到对方就能传值
顺传:给需要传值的对象,直接定义属性就能传值
逆传:用代理,block
4、block的存储
只要block没有引用外部局部变量,block放在全局区。
MRC管理block:
只要block引用外部局部变量,block就放在栈区。
block只能使用copy,不能使用retain,使用retain,block还在栈里面。
ARC管理block:
只要arc引用外部局部变量,block放在堆里面。
block使用strong,尽量不要用copy。
5、block会造成循环引用
block会对里面所有强指针变量都强引用一次。
6、其他
a.如果是局部变量,block是值传递。
int a = 3;
void (^block)() = ^{
NSLog(@"%d",a);
}
a = 5;
block();
//打印输出a = 5
b.如果是静态变量,block是指针传递```
static int a = 3;
void (^block)() = ^{
NSLog(@"%d",a);
}
a = 5;
block();
//打印输出a = 3
c.如果是全局变量,_ _block修饰的变量,block是指针传递
网友评论