iOS --- 循环引用

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

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

相关阅读更多精彩内容

  • 看了《撒哈拉的故事》之后就沉迷于三毛不可自拔。记得刚上大学那会也是喜欢三毛的,那个时候,只是在“不能颓废度日...
    任一泱阅读 5,135评论 0 0
  • 文/李瑶 很感慨也很无奈但更多是遗憾吧!这么多年时光带走的不光是我们的容颜和年岁,也带走了我的家,我曾经的...
    yaobrave阅读 4,044评论 0 1
  • 前段时间带朋友去了复旦大学,去之前我问她为什么一定要去复旦大学呢?她回答我:“因为啊,复旦是我的梦啊”隔着屏幕我能...
    夏靳阅读 3,619评论 2 0
  • ❶ 新生开学报道前十天都是在军训,军训期间总会有学生会的、各种组织的来宿舍宣传,班里还会发学生会的报名表,大家都在...
    罗小扇阅读 2,241评论 6 1

友情链接更多精彩内容