循环引用简单的说就是对象互相持有。
它是引用计数的一个缺陷, 就是对象A和对象B,互相引用了对方作为自己的成员变量,只有自己销毁时才会将成员变量的引用计数减一。而A的销毁 前提是B销毁,同理 B的销毁依赖于A的销毁,这样对象就不能得到释放。造成了循环引用。
循环引用也不止出现在两个变量之间,对象环状持有也会造成循环引用,而环越大越不容易被发现。
解决循环引用有两种方法
1.程序员手动断开一个对象的持有,这种需要程序员在合理的时候主动断开持有,这就要程序员发现程序里会发生循环引用的地方,然后找到合适的时机断开循环,这种解决方法并不好,
2好的方法是弱引用(weak reference)
弱引用虽然持有对象,但是不增加引用计数,这样就避免了循环引用。例如代理就是一个弱引用。