block的循环引用问题

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的生命周期了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容