5

A Jetpack ベースのライブラリでクラスを書いているとします (つまり、chrome/extension コードについて話している) :

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

ユーザーはクラスのインスタンスを作成しますA:

var a = new A();

A作成されたすべてのインスタンスを追跡したい場合は、次のようにします。

var listA = [];

listA.push(this);のコンストラクターを追加し、次のAようにします。

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。助言がありますか?

4

1 に答える 1

3

クラスが弱い参照をサポートしていることを示す必要があるだけです。そして、それの弱参照バージョンを使用したい場合は、それを使用Components.utils.getWeakReferenceして保存する必要があります。 これを JavaScript でさらに使用する方法を示すテスト コードを次に示します。

于 2011-02-25T16:26:29.467 に答える