OC的内存管理应用了计数的方式来管理内存,这种方式虽然很简单,但是有一个比较大的瑕疵,就是它不能很好的解决循环引用的问题.例如对象A和对象B,相互引用了对方作为自己的成员变量,只有当自己销毁时,才会将成员变量的引用计数减1.因为对象A的销毁依赖于对象B的销毁,而对象B的销毁也依赖于对象A的销毁,这样就造成了循环引用的问题即使在外界已经没有任何指针能够访问到他们了,他们依然无法被释放.
循环引用解决的方法:
我们都知道平常使用协议代理的时候我们要使用弱引用(weak),原因就是弱引用虽然持有对象,但是并不增加引用计数,这样就避免了循环引用的产生.例如:两个ViewController A和B,A需要弹出B,让用户来进行输入等操作,然后B需要将内容传给A,这个时候ViewController的delegate成员变量通常是一个弱引用,以避免两个控制器相互引用对方造成循环引用问题.
怎么用Xcode检测循环引用问题:
Xcode有个Instruments工具集可以检测循环引用.在菜单栏选择Product->Profile 然后选择Leaks,再单击右下角的Profile按钮,这个时候模拟器会运行起来,如果出现循环引用就出出现红色的线条,然后我们可以切换到Leak这栏,单击Cycles&Roots就能看到已图形的方式显示出来的循环引用.
网友评论