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的循环引用问题
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 本文主要介绍ARC下block的循环引用问题,举例说明引起循环引用的场景和相应的解决方案。 在讲block的循环引...
- 其实这个问题不需要说太多了,只需要抓住会造成循环引用的本质原因就可以了. 如果block没有直接或者间接被self...
- 《Objective-C高级编程》这本书就讲了三个东西:自动引用计数、block、GCD,偏向于从原理上对这些内容...
- 上次处理了一个因为控制器被某种强引用而无法释放掉,系统没用帮我们释放掉此对象的这块内存的问题,控制器在pop出栈的...