谈到循环引用,大部分人都能联想到代理, 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循环引用,原理上差不多,都是因为相互持有引起,请自行分析
网友评论