(2)对象 A 只负责生成对象 O,之后就由对象 B 负责完成对象 O 的销毁工作。如果对象 B 只是临时用一下对象 O,就可以用完后马上销毁,如果对象 B 需要长时间使用对象 O,就不销毁他。这种做法看似解决了对象复制的问题,但是他强烈依赖于 A 和 B 两个对象的配合,代码维护者需要明确地记住这种编程约定。而且,由于对象 O 的生成和释放在不同对象中,使得他的内存管理代码分散在不同对象中,管理起来也很费劲。如果这个时候情况更加复杂一些,例如对象 B 需要再向对象 C 传递参数对象 O,那么这个对象在对象 C 中又不能让对象 C 管理。所以这种方法带来的复杂度更高,更加不可取。
引用计数的出现很好地解决这个问题,在参数对象 O 的传递过程中,哪些对象需要长时间使用他,就把他的引用计数加1,使用完就减1。所有对象遵守这个规则,对象的生命周期管理就可以完全交给引用计数了。我们也可以很方便地享受到共享对象带来的好处。
2.1 什么是循环引用「Reference Cycles」问题,怎么解决呢?
引用计数这种内存管理方式虽然简单,但有一个瑕疵就是他不能自动解决循环引用的问题。
举个例子:
对象 A 和对象 B 相互引用对方作为自己的成员变量,只有当自己销毁时,才将自己的成员变量的引用计数减1,因为对象 A 和对象 B 的销毁相互依赖,这样就造成我们所说的循环引用问题了。
循环引用会导致即使外界已经没有任何指针能够访问他们了,但是他们所占资源仍然无法释放的情况。
解决循环引用问题主要有两种方法:
(1)明确知道哪里存在循环引用,合理时机主动断开环中的一个引用,使得对象得以回收。这种方法不常用,因为他依赖开发人员自己手工显式控制,相当于回到以前「谁申请谁释放」的内存管理年代。












