Почему удаление слушателей событий не работает? - PullRequest
5 голосов
/ 24 ноября 2011

У меня есть это в моем конструкторе:

addEventListener(Event.REMOVED_FROM_STAGE, actualDestroy);

А это в актуальном Дестрой:

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

Проблема в том, что я получаю Ошибка: Ошибка № 2094: переполнение рекурсии отправки события. Почему removechild продолжает вызываться, если this.parent не существует? Почему не работает удаление прослушивателей событий?

1 Ответ

3 голосов
/ 24 ноября 2011

Название события вводит в заблуждение.removedFromStage, согласно документам, «отправляется, когда экранный объект собирается удалить из списка отображения ».Другими словами, это то, что происходит в вашем коде:

  1. Где-то в вашем коде, вы звоните parent.removeChild(this)
  2. actualDestroy немедленно вызывается.На этом этапе объект все еще находится в списке отображения , поэтому this.parent != null
  3. В actualDestroy вы снова вызываете parent.removeChild(this).
  4. Перейти к шагу2

Таким образом, чтобы решить эту проблему, вы можете реорганизовать свой код (удаление объекта из списка отображения в любом случае никогда не будет хорошей идеей) или использовать некоторое логическое значение, например beingRemoved, дляпроверьте, удаляется ли объект уже из списка.В этом случае не звоните parent.removeChild(this) в actualDestroy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...