使用Block是一个装逼神器,用不好就很容易出现循环引用等问题。
一、Block我们使用的时copy属性,那为什么要用copy而不用其他的属性来修饰呢,其实原理比较简单:
@property(nonatomic, readwrite, copy) completionBlock completionBlock;
(1)正常我们使用Block是在栈上生成的,离开了栈作用域便释放了
(2)如果 copy一个Block ,那么会将这个 Block copy到堆上分配,这样就不再受栈的限制,可以随意使用。
二、Block的循环引用问题
由于我们很多行为会导致 Block的copy ,而当Block被 copy时,会对block 中用到的对象产生强引用 (ARC下) 或者引用计数加一 (non-ARC下) 。
什么是循环引用?
即 对象有一个Block属性,然而这个Block属性中又引用了对象的其他成员变量,那么就会对这个变量本身产生强应用,那么变量本身和他自己的 Block属性就形成了循环引用。
那怎么解决Block的循环引用问题?
ARC下
1.__unsafe_unretained typeof(self) weakSelf = self; 2.__weak typeof(self) weakSelf = self; // 主要使用这个来解决 MRC下 __block typeof(self) weakSelf = self;
self.completionBlock = ^ { if (weakSelf.success) { weakSelf.success(weakSelf.responseData); } };