美文网首页
iOS --- 循环引用

iOS --- 循环引用

作者: BabyNeedCare | 来源:发表于2018-12-07 16:14 被阅读0次

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

    相关文章

      网友评论

          本文标题:iOS --- 循环引用

          本文链接:https://www.haomeiwen.com/subject/iyothqtx.html