1. 简介
block是将函数及其上下文封装起来的对象。(引用别人的)
定义一个简单的block,在xcode中输入inlineBlock 就能看到xcode为我们准备好的代码块。
![646335-a0db1717e9df4cec.png](https://upload-images.jianshu.io/upload_images/646335-a0db1717e9df4cec.png)
block定义
2. block作为属性
定义了一个 名为blockName的成员属性
@property (nonatomic, copy) void(^blockName)(NSString *);
3. block作为方法参数
// 定义方法
- (void)testBlock:(void(^)(NSString * blockParam))callBack{
callBack(@"在方法中 调用了block");
}
// 调用方法
[self testBlock:^(NSString *blockParam) {
NSLog(@"block回调 到这里了 -- %@",blockParam);
}];
3. block作为方法返回值
- (void(^)(NSString * blockParam))blockAsRetrunValue{
void(^blockName)(NSString*) = ^(NSString * param) {
NSLog(@"%@",param);
};
return blockName;
}
4. block 捕获问题
- 对于 基本数据 类型 的 局部变量 截获 其值;
- 对于对象类型 的 局部变量 连同其 所有权修饰符一起截获;
- 局部静态变量 以 指针形式 截获 ;
- 不截获全局变量和静态全局变量 直接访问;
// 基本数据类型 截获其值
int age = 10;
void(^blockName)(void) = ^{
NSLog(@"age == %d",age);
};
age = 20;
blockName();
// 打印结果:age == 10;
// 局部静态变量 以指针形式截获
static int age = 10;
void(^blockName)(void) = ^{
NSLog(@"age == %d",age);
};
age = 20;
blockName();
// 打印结果:age == 20;
5. block的类型
![646335-006d85ff0fb1b619.png](https://upload-images.jianshu.io/upload_images/646335-006d85ff0fb1b619.png)
block分类
6. block的循环引用问题
(1)__block
在ARC 和 MRC都可以使用,可以修饰对象,也可以修饰基本数据类型,可以在block中重新赋值。
(2)__weak
弱引用,只能在ARC下使用,只能修饰对象类型,在block中 只能使用不能修改。
(1)__strong
强引用,防止block中的对象 由于弱引用 被释放。