swift中block循环引用的问题

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

navtionViewController -> Aspa

A->Bcode

B->blcok内存

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

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

 

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

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

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

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

相关文章
相关标签/搜索