2010-03-01 5 views
1

J'essaie de supprimer un objet tween après qu'il est terminé afin que la mémoire puisse être libérée par la récupération de place.Suppression de Tween pour Garbage Collection dans AS3

Dans cet exemple, je transmets à la fonction fadeIn un objet UILoader qui est converti en tant que sprite afin qu'il apparaisse lorsque le chargement est terminé. Lorsque le tween finit d'animer, je souhaite supprimer l'objet tween. J'ai inclus les erreurs du compilateur en tant que commentaires.

function fadeIn(e:Sprite):void 
{ 
    var myTween:Tween = new Tween(e, "alpha", None.easeNone, 0.0, 1.0, 0.2, true); 
    myTween.addEventListener(Event.COMPLETE, deallocateObject, false, 0, true); 
} 

function deallocateObject(e:Event):void 
{ 
    //delete(e.currentTarget); //Warning: 3600: The declared property currentTarget cannot be deleted. To free associated memory, set its value to null. 
    e.currentTarget = null; //1059:Property is read-only. 
} 

Répondre

1

Tout d'abord, vous souhaitez utiliser un TweenEvent pour gérer l'achèvement de l'interpolation. La propriété currentTarget de l'événement est en lecture seule, vous devez « obtenir » la cible actuelle de l'événement et de le jeter comme une interpolation, puis retirez votre événement et réglez-le sur null:

// assuming MC on stage with instance name "test" 

import fl.transitions.*; 
import fl.transitions.easing.*; 

function fadeIn(e:Sprite):void 
{ 
    var myTween:Tween = new Tween(e, "alpha", None.easeNone, 0.0, 1.0, 1, true); 
    myTween.addEventListener(TweenEvent.MOTION_FINISH, deallocateObject, false, 0, true); 
} 

function deallocateObject(e:TweenEvent):void 
{ 
    var myTween:Tween = e.currentTarget as Tween; 
    // -- I always remove even when using weak listeners 
    myTween.removeEventListener(TweenEvent.MOTION_FINISH, deallocateObject); 
    myTween = null; 
} 

fadeIn(test); 

Méfiez-vous quand en utilisant des Tweens locaux dans une fonction. Souvent, ils obtiendront la poubelle collectée avant l'interpolation se termine. Vous devrez déclarer l'interpolation en tant que propriété de classe à la place si cela se produit. Je vous recommande de vous éviter des maux de tête et d'utiliser Tweener, gTween, et al. La classe Tween suce.

1
function fadeIn(e:Sprite):void 
{ 
var myTween:Tween = new Tween(e, "alpha", None.easeNone, 0.0, 1.0, 0.2, true); 
myTween.addEventListener(TweenEvent.MOTION_FINISH, deallocateObject); 
} 

function deallocateObject(e:Event):void 
{ 
delete(e.currentTarget as Tween); 
} 

Cela fonctionne.