循环引用这种方式虽然很简单,但是有一个比较大的瑕疵,就是不能很好的解决循环引用的问题。
什么会造成循环引用问题呢?
比如说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按钮就可以开始检测。
-------------------引自唐巧
网友评论