我正在尝试在完成后删除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.
}
答案 0 :(得分: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);
}
这很有效。
答案 1 :(得分:1)
首先,您希望使用TweenEvent来处理补间的完成。 Event的currentTarget属性是只读的,因此您需要从事件中“获取”当前目标并将其强制转换为补间,然后删除您的事件并将其设置为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);
在函数内部使用本地Tween时注意。通常,他们会在补间完成之前收集垃圾。如果发生这种情况,您必须将补间声明为类属性。我建议你自己节省一些头痛并使用Tweener,gTween等。 Tween类糟透了。