一、循环引用的产生
-- :表示弱引用。
-> :表示强引用。
循环引用可以简单理解为对象A引用了对象B,而对象B又引用了对象A:A -> B -> A,此时双方都同时保持对方的一个引用,导致任何时候双方的引用计数都不为0,双方始终无法释放就造成内存泄漏。
当然不只是两个对象之间相互引用会形成循环引用,多个对象之间相互引用最终形成环同样会形成循环引用。
例如:A -> B -> C -> A。
二、容易造成循环引用的三个场景
1、delegate
self.tableView.delegate = self;
如果 delegate使用strong修饰就会构成循环引用:self -> tableView -> delegate -> self。
所以在定义delegate属性时使用weak便能解决这一问题:self -> tableView -- delegate -> self。tableView和delegate之间不是强引用,所以构不成循环。
规避delegate循环引用的杀手锏也是简单到哭:定义delegate属性时请用assign(MRC)或者weak(ARC),千万别手贱玩一下retain或者strong。
2、NSTimer
详情看我的这篇博客:iOS开发-NSTimer探究
3、block