2009-10-26 6 views
0

Y at-il un moyen de savoir quand un objet sera éliminé par GC?Javascript: savoir quand un objet sera garbaged

Mon objet (appelez-le A) écrit certaines variables dans un objet-tableau global, donc quand l'objet sera garbaged sa propre variable restera dans l'objet-tableau global, prenant de la mémoire.

ps. J'ai de nombreux objets A et je préfère ne pas appeler "manuellement" une méthode pour libérer mon tableau-objet global.

C'est ma situation:

var global_array=[]; 

function A(x){ 
    global_array.push({who:"A", what:x, id:A.instance++}); 
    this.x=x; 
} 
A.instance=0; 
A.prototype.useIt=function(){ 
    return this.x*2; 
} 

//will be created an A object and will be garbaged after use by GC 
function test(){ 
    var a=new A(10); 
    var y=a.useIt(); 
} 

test(); 
//i will never use <a> object again, but global_array hold {who:"A", what:10, id:0)} 

NE VOULEZ PAS

A.prototype.dispose=function(){ 
    // free global_array at the correct index 
} 

Merci.

+0

J'ai modifié ma question pour vous répondre. – blow

Répondre

2

Je ne suis pas sûr de ce que la question est, mais je peux vous dire ceci:

  1. Vous ne pouvez pas dire exactement quand un objet sera nettoyé

  2. Un objet ne peut pas être la poubelle collectées jusqu'à ce que toutes les références à ont été supprimées, donc gardant une référence à un objet dans un tableau stocké dans une variable globale sera assurez-vous qu'il n'est pas collectées jusqu'à ce que la page se décharge.

0

Et qu'en est-il de l'effacer de globla_array à la fin de la méthode d'essai? Comme vous dites qu'il ne sera plus utilisé, il sera sécuritaire d'effacer cette information.

EDIT: En réponse à votre commentaire (comme je pense que je ne peux pas clairement indiqué), nous allons Asume vous pouvez apprendre à savoir quand l'objet A est gc:

function objectGetGC(sender) 
{ 
    // You still have to implement here how to clear global_array from object data 
    // javascript won't know how to do it on its own. 
} 

Si global_array détient une référence à l'objet A, au lieu de seulement des données, ce ne sera pas gc ...

Espérons que maintenant est un peu clair ce que je veux dire.

+0

oui mais je préfère ne pas le libérer manuellement ... – blow

+0

Mais, même si vous savez quand un objet a été collecté ... Vous devrez toujours effacer manuellement votre tableau. Comme Tim l'a fait remarquer, s'il y a une référence dans votre global_array à l'objet A, elle ne sera pas collectée. Et cette référence sera la seule façon dont javascript effacera automatiquement la référence de global_array. –

Questions connexes