美文网首页
block的循环引用问题

block的循环引用问题

作者: 欧巴刚弄死他 | 来源:发表于2017-08-16 15:58 被阅读0次

iOS开发中的block是一种很便利的回调方法,但是它常常会牵扯到内存的循环引用问题。以前都是在block中使用通过__weak和__strong转换过的对象来避免循环引用,但是有些麻烦。
假设这样一个例子:
对象A持有了block B,B持有了对象C,而C又持有A,这样就建立了循环引用,使得三者无法被释放——除非手动管理生命周期!本着封装的设计思路,管理生命周期这种事情当然是交给A来做最好,上层只需要简单使用就可以了。而block必须用copy来修饰,无法像代理对象那样修饰成weak。那么解决办法就是A在调用block B以后将B置为空就可以了,缺点就是C只能收到一次回调。跟这相仿的例子有UIAlertController,它的回调就是用block实现的,所有回调最多只收到一次,或者不收。所以如果C想长期监听A的回调,最好的方案是使用代理模式,这样一来我们在C内部就不需要手动管理A的生命周期了。

相关文章

网友评论

      本文标题:block的循环引用问题

      本文链接:https://www.haomeiwen.com/subject/pbzbrxtx.html