Actionscript 3 AS3中用于垃圾收集的去除吐温

Actionscript 3 AS3中用于垃圾收集的去除吐温,actionscript-3,memory-management,garbage-collection,Actionscript 3,Memory Management,Garbage Collection,我试图在对象完成后删除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.

我试图在对象完成后删除
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.
}

这是可行的。

首先,您需要使用TweenEvent来处理tween的完成。事件的currentTarget属性是只读的,因此您需要从事件中“获取”当前目标并将其转换为tween,然后删除事件并将其设置为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);
在函数中使用局部Tweens时要小心。通常,他们会在tween完成之前收集垃圾。如果发生这种情况,则必须将tween声明为类属性。我建议你省去一些头痛,使用Tweener,gTween等。Tween类很烂

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