循环引用的问题

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

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

比如说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按钮就可以开始检测。



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

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容