【发布时间】:2011-08-29 14:40:51
【问题描述】:
我了解弱引用的工作原理,但我对它在 actionscript 事件侦听器中的使用感到有些困惑。考虑下面的例子:
public class Rectangle extends MovieClip {
public function Rectangle() {
var screen:Shape=new Shape();
screen.addEventListener(MouseEvent.MOUSE_OUT, new Foo().listen, false, 0, true);
addChild(screen);
}
}
public class Foo extends MovieClip {
public function listen(e:MouseEvent):void {
trace("tracing");
}
}
现在,由于只有一个对 Foo 的弱引用,如果垃圾收集器运行并且代码按预期停止工作,那么事件侦听器 Foo 不会被垃圾收集吗?
弱事件侦听器场景是否仅针对以下同一类中的事件侦听器方法规定?
public class Rectangle extends MovieClip {
public function Rectangle() {
var screen:Shape=new Shape();
screen..addEventListener(MouseEvent.MOUSE_OUT, listen, false, 0, true);
addChild(screen);
}
public function listen(e:MouseEvent):void {
trace("tracing");
}
}
在上述场景中,弱事件侦听器是如何提供帮助的?
如果 Rectangle 对象没有其他引用,那么它就是垃圾回收的候选对象,但是由于对象内部有一个事件侦听器,所以事件调度程序持有对该对象的引用,即使没有其他引用对象(事件侦听器持有的对象除外)。因此,它被防止被垃圾收集。这是规定弱事件侦听器的原因吗? Flash播放器是不是太天真了,它无法确定事件监听器是在同一个对象中定义的?
【问题讨论】:
标签: flash actionscript-3 event-handling garbage-collection weak-references