Flash 关于actionscript侦听器中弱引用的澄清

Flash 关于actionscript侦听器中弱引用的澄清,flash,actionscript-3,event-handling,garbage-collection,weak-references,Flash,Actionscript 3,Event Handling,Garbage Collection,Weak References,我理解弱引用是如何工作的,但对于它在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);

我理解弱引用是如何工作的,但对于它在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");        
   }
 }
在上面的场景中,弱事件侦听器就是这样帮助的吗


如果矩形对象没有其他引用,则它是垃圾收集的候选对象,但由于该对象中有一个事件侦听器,因此即使没有对该对象的其他引用(事件侦听器持有的引用除外),事件调度器也会持有对该对象的引用。因此,它不能被垃圾收集。这就是规定弱事件侦听器的原因吗?flash播放器是否太幼稚,以至于无法确定事件侦听器是在同一个对象中定义的?

flash中垃圾收集的基本规则是,如果对象是从时间线引用的(直接或间接),则无法对其进行垃圾收集。这意味着,如果您的类的实例没有从根显示列表中的任何位置被引用(或者由一个从根引用的对象递归地引用),那么不管它是否有对自身的引用,它都将被收集

这也意味着两个相互引用但未从根显示列表中以任何方式引用的对象应该可以进行垃圾收集

事件侦听器中的弱引用选项主要用于避免手动删除事件侦听器。我个人倾向于不使用它,因为我喜欢完全控制对象何时被标记为垃圾收集

因此,在第一个示例中,
Foo
实例在所有情况下都符合垃圾收集的条件。在第二个示例中,是否可以对
矩形
实例进行垃圾收集取决于它是否从显示列表中引用。在这方面,
usewakreference
标志没有区别

从文件中:

类级成员函数不接受垃圾收集,因此您可以将类级成员函数的useWeakReference设置为true,而无需接受垃圾收集。如果为嵌套内部函数的侦听器将useWeakReference设置为true,则该函数将被垃圾收集,不再持久。如果创建对内部函数的引用(将其保存在另一个变量中),则不会对其进行垃圾收集并保持持久性


谢谢你的回答。但是,正如您所说,在上面的场景中,如果Foo符合垃圾收集的条件,那么它就不会违背代码的逻辑。正如中所述,许多博客坚持认为将所有事件侦听器标记为弱引用是一种很好的做法,但在上述情况下,这不会导致错误,因为我希望点击事件一直被触发?好吧,不管一些博客可能会说什么,只有在有意义的情况下才应该使用弱引用。如果需要对象在内存中持久化,请不要使用它。但是,我认为您的示例有点奇怪,因为您首先可能不应该创建这样的匿名对象。对于垃圾收集示例来说,这是可以的,但是作为实际的项目代码,您可能应该重新考虑。