iOS --- 循环引用

2018-12-07  本文已影响0人  BabyNeedCare

谈到循环引用,大部分人都能联想到代理, Delegate的属性是用Weak, 那为什么用Strong就不行呢?

从这个图可以看出,2个对象互相持有,就产生了循环引用。

是不是看着很晕,打个比方:

2个男生,一个叫A,  一个叫B

[A跟B打架, A扯头发,B拉耳朵]

[A说你放手,不然我就更大力扯耳朵]

[B说不放,看谁更疼]

结果。。。可想而知,谁都不放手的情况,就大家都僵持(互相持有)

从开发角度:

Person *A = [[Person alloc]init];//A对象创建,引用计数为1

Person *B = [[Person alloc]init];//B对象创建,引用计数为1

互相引用,意味着引用计数器+1, 导致任何时候引用计数都不为0,始终无法释放,无法释放他们的内存,即使已经没有变量持有他们。

危害:

循环引用最直接体验结果就是闪退。其他不直接体验如:内存消耗过高,性能变差

代理中使用Delegate(用Strong修饰):

代理的书写很简单,这里就不插入代码了,在控制器里重写- (void)dealloc;

会发现里面代码不运行,这是因为控制器仍然存在,控制器引用计数器仍然>1,

只要在View的delegate属性上替换Strong, 变成Weak, 你会惊奇的发现- (void)dealloc可以执行了

以下图是根据自己理解描画,如果有误,请指正。

对于NSTimer, Block循环引用,原理上差不多,都是因为相互持有引起,请自行分析

上一篇下一篇

猜你喜欢

热点阅读