码迷,mamicode.com
首页 > 编程语言 > 详细

swift中block循环引用的问题

时间:2018-07-31 21:48:39      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:循环引用   存在   rop   如何   ops   解决   自动   内存泄漏   self   

在navtionViewController的子控制器A中,将B控件作为其的一个属性,在定义B控件的一个block,并在此block中引用了A控制器的属性,block此时捕获了A,就形成了间接的循环引用。

navtionViewController -> A

A->B

B->blcok

block -> A.someProps   === block =>A

即使用户退出了A控制器,即A控制器调用了pop方法,也就是navtionViewController不再引用A了,但是B的block还是引用了A,此时A的实例还会保存在内存中,不会被释放。内存泄漏就出现了

 

解决方法,在定义block的时候,在其参数前面使用[weak self]或者[unowned self]。

如何选择弱引用,还是无主引用?

当闭包和捕获的实例总是互相引用时并且总是同时销毁时,将闭包内的捕获定义为无主引用(使用[unowned self])。

相反的,当捕获引用有时可能会是nil时,将闭包内的捕获定义为弱引用(使用[weak self])。弱引用总是可选类型,并且当引用的实例被销毁后,弱引用的值会自动置为nil。这使我们可以在闭包内检查它们是否存在。

 

swift中block循环引用的问题

标签:循环引用   存在   rop   如何   ops   解决   自动   内存泄漏   self   

原文地址:https://www.cnblogs.com/heyode/p/9397513.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!