2010-03-01 3 views
1

Я пытаюсь удалить объект tween после его завершения, чтобы память могла быть освобождена сборкой мусора.Удаление Tween для сбора мусора в AS3

В этом примере я передаю функцию fadeIn объект UILoader, который отливается в качестве спрайта, так что он исчезает, когда он заканчивается загрузкой. Когда tween завершает анимацию, я хочу удалить объект tween. Я включил ошибки компилятора в качестве комментариев.

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. 
} 

ответ

1

Прежде всего, вы хотите использовать TweenEvent для обработки завершения анимации. Свойство currentTarget события только для чтения, так что вы должны «получить» текущую цель от события и брось как твин, затем удалить событие и установить его в нуль:

// 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); 

Берегись, когда используя локальные Tweens внутри функции. Часто они получат сбор мусора до. Вы должны будете объявить анимацию как свойство класса, если это произойдет. Я рекомендую сэкономить себе головную боль и использовать Tweener, gTween, et al. Класс Tween отстой.

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); 
} 

Это работает.

Смежные вопросы