2011-02-25 12 views
5

benim Jetpack tabanlı kütüphanede A(biz krom/uzatma kodu bahsediyoruz yani) bir sınıf yazıyorum varsayalım:Zayıf referans

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

kullanıcı oluşturan bir sınıfın A örneği:

var a = new A(); 

şimdi oluşturulan A tüm örneklerini takip etmek istediğinizi varsayalım, elimden:

var listA = []; 

ile biten, A yapıcısı içinde listA.push(this); ekleyin:

var listA = []; 

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

A.prototype = { 
    // class members 
}; 

a kullanım referansını düşene kadar, tüm ince (ör a kapsam dışıdır). Şimdi bir sorunum var:hala a referansı içerir, bu yüzden asla çöp toplanmayacaktır. Üstelik, A arasındaki örneklerin, erişilemeyen filtrelerini filtrelemenin hiçbir yolu yoktur. Ben etkili bir şekilde hafıza sızıntısı yapıyorum.

İhtiyacım olan şey, sıradan olanlar yerine listA zayıf referanslara zorlamak. Sanırım bir şekilde yapmak mümkün, ama gerçekten buradan nereye gideceğimi bilmiyorum. Ben böyle bir şey tahayyül edebilirsiniz:

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

Ama sonra bilmiyorum, bir zayıf başvuruya hala geçerli olup olmadığını, örneğin nasıl test etmek. Ya da listA'daki zayıf girişleri verimli bir şekilde filtreleyebilirsiniz. Baska öneri?

+0

çok ... listA bir üyesidir? –

+0

nope. Soruyu düzenledim, umarım artık daha açık. – CAFxX

cevap

3

Sadece sınıfınızı indicate it supports weak references yapmalısınız. Ardından, zayıf referans sürümünü kullanmak istediğinizde, Components.utils.getWeakReference'u kullanmak ve bunu saklamak istersiniz. JavaScript'te daha fazla nasıl kullanılacağını gösteren Here is some test code.

+0

Teşekkürler! Tam olarak aradığım şey buydu. Sorunun dizi muhasebesi kısmının nasıl yapılacağına dair bazı tavsiyeleriniz var mı (yani, GC tarafından yeniden iyileştirildiklerinde diziden öğeleri etkin bir şekilde kaldırarak)? Zayıf bir referans geçersiz hale geldiğinde çalıştırılabilecek bazı geri arama var mı? – CAFxX

+0

Farkında olduğum bir geri arama yok. Array.filter ile sık sık her şeyi yinelemeniz ve boş girişleri kaldırmanız gerekir. Bir karma masası kullanmak için daha hızlı olabilir. – sdwilsh

+0

nsXPCOMCycleCollectionParticipant betiğe sahipse ne olur? Aşırı yüklenebilirim :: Unlink() ve bir çeşit otomatik yıkıcı olarak kullanıyorum ... – CAFxX