2009-06-27 5 views
0

J'ai une classe qui est appelée un certain nombre de fois. Lorsque l'application passe à l'étape suivante, celles-ci doivent toutes être déchargées. Pour cette raison, j'ai créé une méthode unload() dans la classe. Le problème est que je n'arrive pas à mettre ma variable uint "charId" à zéro pour la "désinstaller". La commande "delete" n'est pas non plus possible car elle ne s'applique qu'aux variables dynamiques ou à quelque chose de ce genre.Comment puis-je supprimer un entier (non signé) dans ActionScript/Flex 3?

Maintenant, je me demande, comment suis-je censé désactiver cette variable, donc sa mémoire sera ré-allouée plus tard?

méthode de déchargement de la classe:

public function unload():void 
     { 
      trace("Unloading character with charname '" + charName + "'."); 
      enterButton.removeEventListener(MouseEvent.CLICK, enterClicked); 
      removeChild(enterButton); 
      enterButton = null; 
      charName = null; 
      charId = null; //this is possible but not recommended - what's a better way? 
      lobbyInterface = null; 
     } 

Alors oui, il est possible dans la pratique, car il modifie le type de variable - mais il est pas recommandé et d'élever un avertissement. Alors, quelle est la meilleure façon de le faire?

Notez que cet objet est également déchargé dans son parent. Est-ce que cela libère aussi toutes ces variables de la mémoire?

Répondre

1

uint, int, Number et Boolean ne sont pas annulable en AS3. Le numéro peut être NaN, mais c'est vraiment le meilleur que vous pouvez obtenir. int et uint sont toujours juste 32 bits, donc vous ne pouvez pas insérer une référence nulle là-dedans.

Le type de nettoyage que vous essayez de faire ne peut pas être accompli puisque AS3 a le concept de classes scellées. Une classe scellée a une taille fixe en mémoire. En ce qui concerne les variables d'instance, pensez-y en tant que C struct, vous ne pouvez que tout vider ou rien. Vous pouvez bien sûr faire n'importe quoi en C, c'est un bloc fixe en mémoire, une entité d'une référence par variable.

Ce que vous voulez faire fonctionne seulement avec des variables dynamiques, qui sont maintenues différemment.

Vous n'avez pas besoin de faire ce genre de nettoyage, car Flash a le garbage collection comme la plupart des runtimes de nos jours. Il traite également des références imbriquées et circulaires, la seule chose dont vous devez être sûr est que vous supprimez toute référence "externe" à cette classe. Les objets qui ne sont généralement pas collectés sont des objets de la liste d'affichage, des minuteurs et des intervalles, et des éléments liés aux E/S. Dès que vous avez une chaîne de référence à partir de là vers votre objet, il ne sera pas collecté. Supposons que vous ayez un object A avec un gestionnaire d'événements pour un mouvement de souris sur un objet dans une liste, en faisant référence à un object B. B ne sera pas collecté, mais dès qu'il n'y aura pas de chaîne menant à un objet, il sera collecté (tôt ou tard, le GC est assez paresseux mais plus on utilise de mémoire, plus il fait son travail).

+0

Y at-il un moyen pour moi de déboguer l'application et voir à quels objets sont référencés à ce moment-là? De cette façon, je peux voir si cela va vraiment être ramassé – Tom

+0

@Tom - le Profiler (disponible dans la version Pro de Flex) vous donnera cette information. 500 $. Ça vaut vraiment le coup, OMI, si vous avez l'argent. L'API Profiler est cependant exposée. Probablement complètement infaisable pour construire le vôtre, mais peut-être vous pouvez obtenir juste la tranche de fonctionnalité dont vous avez besoin. http://livedocs.adobe.com/flex/3/html/help.html?content=profiler_3.html –

+0

@Tom - vous pouvez également consulter l'article sur la récupération de place dans AS. Il y a certainement d'autres articles, mais c'est de facto "à lire". http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html –

Questions connexes