2010-04-09 5 views
1

la méthode suivante sera appelée plusieurs fois. Je suis préoccupé par l'appel continu pour de nouveaux rectangles va ajouter une consommation de mémoire potentiellement inutile, ou la mémoire utilisée pour produire le rectangle précédent libéré/écrasé pour accueillir un autre rectangle, car il est affecté à la même variable d'instance?question rapide sur la gestion de la mémoire dans AS3

private function onDrag(evt:MouseEvent):void 
     { 
     this.startDrag(false, dragBounds()); 
     } 

private function dragBounds():Rectangle 
    { 
    var stagebounds = new Rectangle(0 - swatchRect.x, 0 - swatchRect.y, stage.stageWidth - swatchRect.width, stage.stageHeight - swatchRect.height); 
    return stagebounds; 
    } 

Répondre

4

C'est une question rapide, mais très importante! Trop peu de développeurs ActionScript se soucient de la même chose. Alors bravo à toi!

Chaque fois que vous créez un nouveau rectangle, une nouvelle mémoire lui est allouée. Dès que toutes les références à ce rectangle sont supprimées, il devient éligible pour la récupération de place (GC), ce qui signifie que la prochaine fois que le GC sera exécuté, il sera libéré de la mémoire. (Dans ce cas, toutes les références sont supprimées lorsque vous appelez stopDrag())

Une instance de Rectangle prend très peu de mémoire, et avec le garbage collector exécuté à intervalles réguliers, les instances seront constamment nettoyées. De plus, nous pouvons être certains que pas plus d'un ne sera créé à un moment donné sans qu'une instance précédente ne soit disponible pour GC. (En supposant que vous appelez stopDrag avant d'appeler à nouveau dragBounds.)

Vraiment, c'est un cas où vous n'avez pas besoin de vous en préoccuper. Votre code est bien tel quel. Vous auriez besoin de plusieurs milliers de Rectangles (comme des millions, à la fois) avant de rencontrer des problèmes potentiels.

+0

merci pour la réponse, tyler. donc je comprends maintenant que stopDrag() supprimera les références de startDrag(). mais qu'en est-il si dragBounds() a été appelé plusieurs fois mais n'a pas été appelé par startDrag()? Supposons que le rectangle est un grand objet de mémoire qui s'accroche. devrais-je rendre sa variable d'instance accessible à toute la classe afin de l'annuler avant d'en créer une nouvelle comme celle-ci? - if (stageBounds) {stageBounds = null}; stageBounds = nouveau Rectangle (...); - – TheDarkIn1978

+1

Annuler une valeur ne la libère pas de la mémoire, supprime uniquement la référence, ce qui la rend potentiellement disponible pour GC. Tant que toutes les références sont nettoyées, le GC le trouvera et l'enlèvera. Vous ne pouvez pas forcer cela à se produire. Avec les objets volumineux, vous pouvez les réutiliser plutôt que d'en créer de nouveaux. Cela peut être bénéfique si le coût de la création d'un nouveau est supérieur à celui que vous savez que vous aurez besoin à nouveau bientôt. –