2011-02-25 11 views
5

Supongamos que estoy escribiendo una clase Aen mi biblioteca basada en Jetpack (es decir, estamos hablando de cromo código/extensión):referencia débil en el código JavaScript de Firefox cromo

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

crea al usuario una instancia de la clase A:

var a = new A(); 

ahora supongamos que quiero hacer un seguimiento de todos los casos de A que fueron creados, que podía hacer:

var listA = []; 

y añadir listA.push(this); en el constructor de A, para terminar con:

var listA = []; 

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

A.prototype = { 
    // class members 
}; 

todo está bien, hasta que el usuario de a gotas su referencia (por ejemplo, a sale del alcance). Ahora tengo un problema: listA todavía contiene una referencia a a por lo que nunca será basura recolectada. Además, no tengo manera de filtrar las instancias listA de A que de otra forma serían inalcanzables. Estoy efectivamente filtrando memoria.

Lo que necesitaría es presionar a listA referencias débiles en lugar de las regulares. Creo que es posible hacerlo de alguna manera, pero realmente no sé a dónde ir desde aquí. Puedo imaginar algo como:

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

Pero entonces yo no saber, por ejemplo, la forma de probar si una referencia débil sigue siendo válida. O cómo filtrar de manera eficiente las entradas débiles muertas en listA. ¿Alguna sugerencia?

+0

tan ... listA es miembro de? –

+0

no. Edité la pregunta, espero que esté más claro ahora. – CAFxX

Respuesta

3

Solo necesita hacer su clase indicate it supports weak references. Luego, cuando desee utilizar la versión de referencia débil de la misma, querrá usar Components.utils.getWeakReference y almacenar eso. Here is some test code que le muestra cómo usarlo más en JavaScript.

+0

Gracias! Eso es precisamente lo que estaba buscando. ¿También tiene algún consejo sobre cómo hacer la contabilidad de la matriz como parte de la pregunta (es decir, eliminando de manera eficiente los elementos de la matriz cuando GC los recalifica)? ¿Hay alguna devolución de llamada que pueda explotar que se ejecute cuando una referencia débil se vuelve inválida? – CAFxX

+0

No hay devolución de llamada que yo sepa. Tendrás que iterarlo de vez en cuando con 'Array.filter' y eliminar las entradas nulas. Puede ser más rápido usar una tabla hash también. – sdwilsh

+0

¿Qué pasa si nsXPCOMCycleCollectionParticipant fuera programable? Podría sobrecargar :: Desvincular() y usarlo como un tipo de destructor automático ... – CAFxX

Cuestiones relacionadas