循环引用产生的原因是对象的互相引用导致产生了环释放不了内存。
正常对象持有释放顺序是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的时候弱引用,让它得以释放。
循环引用
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 前言 在上篇中,仔细分析了一下Block的实现原理以及__block捕获外部变量的原理。然而实际使用Block过程...
- 《Objective-C高级编程》这本书就讲了三个东西:自动引用计数、block、GCD,偏向于从原理上对这些内容...