iOS细节篇-block循环引用问题,和block安全使用方法
什么时候block循环引用
循环引用是什么这里就不解释了
在我平时开发中遇到block循环引用问题要满足一下两个条件
1.定义一个block作为属性定义的类
2.在实现block的类中使用了,强引用的成员变量(self.XXX)
满足上面两种情况就会循环引用,会造成循环引用,内存就会泄漏。
怎么解决循环引用
了解了循环引用原理就大概知道了怎么解决它。
方案一
__weak typeof (self) weakSelf = self;
方案二
__unsafe_unretained typeof (self) weakSelf *weakSelf = self;
这两种方案都是断掉循环引用链。
第一种和第二种区别在于当 引用对象为nil时weak的指向会指向nil指针,而__unsafe_unretained还是指向原来的内存。
所以说我们开发的时候只要用weak就好了__unsafe_unretained这个就是装逼的没什么大用处。
怎么样安全使用
在满足
1.定义一个block作为属性定义的类
2.在实现block的类中使用了,强引用的成员变量(self.XXX)
的情况下用
__weak typeof (self) weakSelf = self;
然后要在block中用__strong
__weak typeof (self) weakSelf = self;
model.block = ^(){
__strong typeof (weakSelf) strongSelf = self;
XXXXXX
}
在里面是用__strong的原因是因为防止block在执行的时候外部的self对象被释放掉了。这时候block内部的weakSelf就会为nil。所以block内部要有一个强指针指向self对象,当block代码执行完了之后释放。这里__strong可以省略(系统默认),为了可读性可以写。