Actionscript 3 AS3局部变量的垃圾收集

Actionscript 3 AS3局部变量的垃圾收集,actionscript-3,flash,garbage-collection,Actionscript 3,Flash,Garbage Collection,如果函数中的局部变量注册了一些事件列表器,是否有方法删除该事件列表器?listner触发事件后,该变量是否会被垃圾收集 示例代码: Class A{ function init(){ var _loader = new URLLoader(); _loader.addEventListener(Event.COMPLETE, complete); } function complete(e:Event){ //How to remove the event listner h

如果函数中的局部变量注册了一些事件列表器,是否有方法删除该事件列表器?listner触发事件后,该变量是否会被垃圾收集

示例代码:

Class A{

function init(){
    var _loader = new URLLoader();
    _loader.addEventListener(Event.COMPLETE, complete);
}

function complete(e:Event){
//How to remove the event listner here on _loader since it is a local variable in init() and not an instance variable. 
//Will _loader be ever garbage collected?
}

}

如果
\u loader
是一个实例变量,我们可以在
complete
处理程序函数中引用它,并删除它上的eventlistner,让它被垃圾收集。局部变量(如
\u loader
)会发生什么情况?

您可以使用事件对象的currentTarget:

function complete(e:Event):Void {
   URLLoader(e.currentTarget).removeEventListener(Event.COMPLETE, complete);
}

此外,还要注意局部变量和事件侦听器。从理论上讲(因为我无法找到关于它的官方文档,所以这样说),一旦函数过期,您的loader变量就有资格进行垃圾收集。当然,在大多数情况下,这种情况不会立即发生,所以你的听众会很好地激发。但我仍然会将其设置为类变量。

是否需要将e.currentTarget强制转换为对象类型(本例中为URLLoader)才能删除事件列表器?@dev_musings我猜,由于对象是一个动态类,因此不必强制转换它,它不应该引发异常。强制转换更好,因为它将帮助编译器找出错误。在大多数编辑器中,它将打开代码提示。没有什么错误可以来自于施法,也有很多错误可以来自于不施法。