美文网首页iOS Crazies
循环引用的问题

循环引用的问题

作者: 慕言澈 | 来源:发表于2016-09-07 16:43 被阅读11次

    循环引用这种方式虽然很简单,但是有一个比较大的瑕疵,就是不能很好的解决循环引用的问题。

    什么会造成循环引用问题呢?

    比如说A和B两个对象,相互引用了对方作为自己的成员变量。只有当自己销毁的时候才能将成员变量的引用计数-1。但是因为A对象的销毁又依赖于B对象,B对象销毁又依赖于A对象。这样就造成了循环引用的问题。英文称之为Reference Cycle。在外界这两个对象已经没有任何对象能够访问到了,而且也不能被释放。

    解决循环引用问题的方法:

    1.第一种就是我们清楚地知道这里有循环引用,在合理的位置(根据业务的具体逻辑)主动断开循环中的一个引用,使得对象得以回收。

    主动断开循环引用这种常见于各种block相关的代码逻辑中

    2.使用弱引用

    弱引用虽然持有对象,但是并不增加引用计数,这样就避免了循环引用的产生,在iOS开发中,弱引用通常在delegate模式中使用,举个例子来说吧,两个ViewController, A和B,viewControllerA需要弹出ViewControllerB,让用户输入一些内容,当用户输入完成之后,ViewControllerB需要返回给ViewControllerA,这个时候viewController的delegate对象通常是一个弱引用,以避免两个ViewController相互引用对方造成循环引用的问题

    弱引用的实现原理:

    弱引用的实现原理,系统对于每一个有弱引用的对象,都维护一个表来记录它所有的若引用的指针地址。这样,当一个对象的引用计数为0的时候,系统就通过这张表,找到所以的弱引用指针,继而将他们都设置成为nil

    使用Xcode检测循环引用

    Xcode中的instrument工具可以很方便的检测循环引用。

    在Xcode的菜单栏选择:Product ->Profile,然后选择Leaks,在点击右下角的Profile按钮就可以开始检测。

    -------------------引自唐巧

    相关文章

      网友评论

      • 苦可乐:问你个问题 循环引用会造成什么问题啊
        慕言澈: @苦可乐 对象没法儿释放,内存泄露咯

      本文标题:循环引用的问题

      本文链接:https://www.haomeiwen.com/subject/vxejettx.html