之前一直很不理解高程三中,引用计数因为互相引用导致的内存泄漏的问题。
经过自己的‘瞎猜’,我大概是明白了什么意思。
function problem () {
var objectA = new Object();
var objectB = new Object();
objectA.someOtherObject = objectB;
objectB.anotherObject = objectA;
}
书上说这两个对象相互引用,导致计数都为2,所以还会存在内存中而不会释放。计数为2我们都明白,可是为什么会释放不掉呢。
那是因为内存运行这个函数以后,也就是离开这个函数环境的时候,会将所有变量的计数减1,然而objectA.someOtherObject和objectB.anotherObject分别是objectA和objectB的属性,所以不会将它们的计数减1。所以,objectA和objectB的计数不会为0,将不会被回收释放。
换个例子:
function problem () {
var objectA = new Object();
var objectB = new Object();
objectA.someOtherObject = objectB;
}
首先,这两个对象,objectA计数为1,objectB计数为2。这里的函数没有相互引用,不会内存泄漏。因为当退出函数环境时,先将objectA的计数减1,也就是直接释放。那么objectA.someOtherObject属性也将会对objectB的计数减1,objectB因为函数的环境退出,也减1,objectB引用计数就为0,内存释放。
如有不对之处,请您指出,相互学习