循环引用

循环引用产生的原因是对象的互相引用导致产生了环释放不了内存。
正常对象持有释放顺序是B对象是A对象的属性,若对A发送release消息,致使A引用计数为0,则会dealloc A对象,而在A的dealloc的同时,会向B对象发送release消息,B被释放,内存被正确回收。不正确的对象持有,A对象持有B对象,B对象持有A对象,A对象想要释放需要它的持有者B对象发送release消息,但是B对象释放也需要它的持有者A发送relesase消息,都在互相等待持有者发送release消息,就是循环引用,造成内存无法释放。
如何接触循环引用,例子。
delegate为什么要用week修饰。
如果delegate用strong修饰,在B中A.delegate = B; 由于A的属性delegate持有B,等于A持有B,但是B中又持有A,就造成了环,由于都是强引用,所以释放不了,只有把delegate改成弱引用,才能打破这个环。
block中调用self的属性为什么要用__weak typeof(self) weakSelf = self。
由于self持有block,而如果block中在持有self的话,就形成了环,打破环的话就需要引用self的时候弱引用,让它得以释放。

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

相关阅读更多精彩内容

友情链接更多精彩内容