循环引用

循环引用产生的原因是对象的互相引用导致产生了环释放不了内存。
正常对象持有释放顺序是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的时候弱引用,让它得以释放。

你可能感兴趣的:(循环引用)