參考

2011-02-25 64 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