Удаление Твин для сборки мусора в AS3 - PullRequest
1 голос
/ 01 марта 2010

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

В этом примере я передаю функции 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.
}

Ответы [ 2 ]

1 голос
/ 01 марта 2010

Прежде всего, вы хотите использовать TweenEvent для обработки завершения анимации. Свойство currentTarget для Event доступно только для чтения, поэтому вам нужно «получить» текущую цель из события и привести ее к анимации движения, затем удалить событие и установить его в 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);

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

1 голос
/ 01 марта 2010
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);
}

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

...