为什么不删除事件侦听器?

aps*_*nce 5 actionscript-3

我在构造函数中有这个:

addEventListener(Event.REMOVED_FROM_STAGE, actualDestroy);
Run Code Online (Sandbox Code Playgroud)

这在realDestroy中:

    public function actualDestroy(e:* = null){
        removeEventListener(Event.REMOVED_FROM_STAGE,actualDestroy);
        if(this.parent){
            this.parent.removeChild(this);
        }
    }
Run Code Online (Sandbox Code Playgroud)

问题是我得到错误:错误#2094:事件调度递归溢出.如果this.parent不存在,为什么removechild会被调用?为什么不删除事件侦听器?

lau*_*ent 3

该事件的名称具有误导性。removedFromStage根据文档,“当显示对象即将从显示列表中删除时调度”。换句话说,这就是您的代码中发生的情况:

  1. 在代码中的某个地方,您调用parent.removeChild(this)
  2. actualDestroy立即被调用。此时该对象仍在显示列表中,因此this.parent != null
  3. actualDestroy,你parent.removeChild(this)再次打电话。
  4. 转到步骤 2

因此,要解决此问题,您可能需要重构代码(从显示列表中删除自身的对象无论如何都不是一个好主意),或者可能使用一些布尔值来beingRemoved检查该对象是否已从列表中删除。在这种情况下,请勿parent.removeChild(this)致电actualDestroy