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出栈的...