2010-04-28 3 views
0

Puis-je savoir quelle est la bonne façon de garder trace des objets d'affichage créés et donc de me permettre de les supprimer plus tard, pour la collecte des ordures. Par exemple:Comment garder une trace des objets pour la collecte des ordures

for(i=0; i<100; i++){ 
var dobj = new myClass(); //a sprite 
addChild(dobj); 
} 

D'après ce que je sais, la collecte des ordures de flash ne recueillera que les objets sans références solides et des écouteurs d'événements qui s'y rattachent.

Étant donné que le var dobj est fortement référencé par rapport au nouvel objet créé, je vais devoir le "annuler" aussi, ai-je raison?

Dois-je créer un tableau de garder une trace de tous les objets créés dans la boucle tels que:

var objectList:Array = new Array();  

for(i=0; i<100; i++) 
     { 
      var dobj = new myClass(); //a sprite 
      addChild(dobj); 
      objectList.push(dobj); 
     } 

//remove all children 
for each (var key in objectList) 
{ 
    removeChild(key as myClass); 
} 

Cela permet-il de recueillir GC sur balayage?

+0

Mais puisque cela passe la référence d'objet à une fonction, qui (je suppose) stocke la référence, la référence à l'objet est toujours valide. – amphetamachine

Répondre

1

var dobj est une variable locale, donc après vos fonctions, cette référence a disparu. À ce stade, la seule référence sera le fait que l'élément est sur la liste d'affichage (c'est-à-dire qu'il est affiché). Donc, aucun travail supplémentaire n'est nécessaire pour qu'il soit collecté, juste que vous devez l'enlever. Bien sûr, il peut y avoir d'autres références ailleurs, comme des écouteurs d'événements, etc.

Votre deuxième exemple de code devrait fonctionner, à condition que vous vous souveniez de les supprimer non seulement de la liste d'affichage, mais également de les supprimer de le tableau. Ou vous pourriez utiliser un dictionnaire avec des références faibles, alors vous n'auriez pas besoin de les supprimer du dictionnaire. Annulez-le ou laissez-le devenir hors de portée.

0

Oui, cela ne permet de recueillir GC si vous avez pas d'autres références à de fortes, et il est ce qui se fait habituellement en flash.

La distribution dans removeChild est cependant inutile.

En outre, rappelons à mettre à ObjectList nul ou à un new Array() ou fixé à chaque élément de celui-ci à null.

0

La plupart des garbage collectors gardent trace des objets quand ils sont créés. La solution pour les langages comme C++ (et une bibliothèque GC) alloue de la mémoire via un wrapper autour de new(). Quelque chose comme:

var dobj = myNew myClass(); // un sprite

Je ne sais pas trop sur Flex GC, mais en général, vous devriez le laisser faire son travail. Si cela est basé sur de solides références, cela fonctionnera.

Questions connexes