Block 初见 介绍 iOS block 的相关知识
目录
Block背景知识
1.Block的类
类 | 存储位置 |
---|---|
_NSConcreteStackBlock | 栈 |
_NSConcreteGlobalBlock | 程序的数据区域(.data区) |
_NSConcreteMallocBlock | 堆 |
Block使用方式
- Block 语法
- 局部变量方式定义
BOOL (^checkBookName)(NSString *name) = ^BOOL(NSString *name) {
if ([name isEqualToString:@"Digital Castle"]) {
return true;
} else {
return false;
}
};
- 全局变量定义
@property (nonatomic, copy) BOOL (^authorNameCheck)(NSString *name);
- 作为方法参数定义
- (void)checkBookNameBlock:(BOOL (^)(NSString *name))checkBookName
- 使用typedef定义
typedef BOOL (^authorNameCheck)(NSString *name);
Block常见问题
- 循环引用
-
原因
两个对象互相强引用就会造成循环引用,无法进行释放。
检验是否出现循环引用的方式,是看对象是否持有了block。
- 错误示例
self.descriptionCheck = ^() {
[self checkDescription];
};
因此如果一方是弱引用,则不会出现循环引用的问题,这就是系统 animation 的 block 中可以直接用 self 的原因。
//直接声明weakSelf
__weak __typeof(self)weakSelf = self;
//使用宏定义,会自动产出self__weak_对象
#define weakify(o) __typeof__(o) __weak o##__weak_ = o;
//使用rac weakself
@weakify(self);
self.descriptionCheck = ^() {
__strong __typeof(weakSelf) strongSelf = weakSelf;
if (strongSelf) {
[strongSelf checkDescription];
}
[self__weak_ checkDescription];
@strongify(self);
if (!self) return;
[self checkDescription];
};
- 取消block
通过修改status值来不执行block块内的方法
BOOL status = false;
@weakify(self);
self.descriptionCheck = ^() {
@strongify(self);
if (!self) return;
if (status) {
[self checkDescription];
}
};
- block delegate 的区别
区别见如下列表
区别 | block | delegate |
---|---|---|
修饰符 | copy | weak |
使用场景 | 单一回调 | 多重回调 |
swift 中的 block 默认是否是可变的
swift 中的 block 默认是可变的为什么property不需要用__block进行修饰即可被block修改?
示例参见 github Demo