如果函数中的局部变量注册了某些事件列表器,是否有办法删除该事件列表器?在事件列表器触发后,该变量是否会被垃圾收集?
示例代码:
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?
}
}
如果_loader
是一个实例变量,我们可以在complete
处理函数中引用它并删除它上面的eventlistner,让它被垃圾收集。局部变量如_loader
会发生什么?
答案 0 :(得分:2)
您可以使用事件对象的currentTarget:
function complete(e:Event):Void {
URLLoader(e.currentTarget).removeEventListener(Event.COMPLETE, complete);
}
另外,请注意局部变量和事件侦听器。从理论上讲(因为我无法找到关于它的官方文档),一旦函数到期,你的loader变量就有资格进行垃圾收集。当然,在大多数情况下,这不会立即发生,所以你的听众会解雇。但我仍然会把它变成一个类变量。