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

时间:2011-11-24 04:25:16

标签: actionscript-3

我在构造函数中有这个:

addEventListener(Event.REMOVED_FROM_STAGE, actualDestroy);

这在realDestroy中:

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

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

1 个答案:

答案 0 :(得分:3)

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

  1. 在代码的某处,您可以致电parent.removeChild(this)
  2. 立即调用
  3. actualDestroy。此时,对象仍在显示列表中,因此this.parent != null
  4. actualDestroy,您再次致电parent.removeChild(this)
  5. 转到第2步
  6. 所以要解决这个问题,你可能想要重构你的代码(从显示列表中删除自己的对象无论如何都不是一个好主意),或者可能使用像beingRemoved之类的布尔来检查对象是否是已从列表中删除。在这种情况下,请勿在{{1​​}}中致电parent.removeChild(this)