参考

2011-02-25 79 views
5

想我写一个类A在我基础的Jetpack库(即我们谈论的铬/扩展代码)参考

function A() { 
    //constructor 
} 
A.prototype = { 
    //class members 
}; 

用户创建A类的实例:

var a = new A(); 

现在假设我要跟踪所创建的的A所有实例的,我可以这样做:

var listA = []; 

和在A构造添加listA.push(this);,与结束了:

var listA = []; 

function A() { 
    // constructor 
    listA.push(this); 
} 

A.prototype = { 
    // class members 
}; 

所有细,直到a用户放下它的参考(例如a超出范围)。我现在有一个问题:listA仍然包含对a的引用,所以它将永远不会被垃圾收集。此外,我无法过滤listA实例A否则无法访问。我正在有效地泄漏记忆。

我需要的是推到listA弱引用,而不是普通的引用。我认为可以以某种方式做到这一点,但我不知道该从哪里出发。我可以想像这样的:

var weak_a = new weakRef(a); 
assert(weak_a.ref === a); 

但是我不知道,例如,如何测试弱引用是否仍然有效。或者如何有效地筛选出listA中的弱项。有什么建议么?

+0

so ... listA是一个? – 2011-02-25 16:04:07

+0

nope。我编辑了这个问题,希望现在更清楚。 – CAFxX 2011-02-25 16:15:47

回答

3

你只需要让你的课indicate it supports weak references。然后,当你想使用它的弱引用版本时,你需要使用Components.utils.getWeakReference并存储它。 Here is some test code,向您展示如何在JavaScript中更多地使用它。

+0

谢谢!这正是我所期待的。你是否也有过关于如何做问题的数组簿记问题的建议(即当他们被GC重新标记时,从数组中有效地移除项目)?当弱引用变为无效时,是否有一些回调可以被利用? – CAFxX 2011-02-25 16:48:40

+0

我没有意识到的回调。你只需要经常用'Array.filter'迭代它并删除空条目。也可以更快地使用哈希表。 – sdwilsh 2011-02-25 17:52:02

+0

如果nsXPCOMCycleCollectionParticipant可以编写脚本,该怎么办?我可以超载:: Unlink()并将其用作某种自动析构函数... – CAFxX 2011-02-26 07:23:09