flash AS3 как удалить прослушиватели событий сцены

Я создаю анимацию во flash и as3, у меня есть функция, в которой я добавляю stage eventListener, stage.addEventListener (Event.ENTER_FRAME, setScrollPercent, false, 0, true);

Поскольку это событие устанавливается внутри функции функции, «на две функции в глубину», как я могу сбросить все прослушиватели событий этапа извне функций без получения ошибки?

Ответов (4)

Решение

Лучшие практики с прослушивателями событий AS:

  • Сделайте его слабым (как вы это сделали, последний параметр addEventListener)
  • Установите для прослушивателя событий значение null после обработки (строго говоря, не требуется, если вы настроили его как слабый)

Flex не дает вам деструкторов. У него есть собственный сборщик мусора, который негласно управляет памятью. Он очищает часть памяти, если на нее нет ссылок. Что ж, сильные ссылки. Все объекты по умолчанию имеют сильную ссылку. Обработчики событий, поскольку они, как правило, являются узким местом в производительности, обладают особой способностью объявлять себя слабыми - слабая ссылка. Конечно, это возможно только тогда, когда вы присоединяете обработчики событий с помощью addEventHandler() функции. Слабые ссылки не принимаются во внимание сборщиком мусора, и, следовательно, когда все сильные ссылки исчезнут, они будут автоматически собраны мусором, освобождая вас от необходимости делать =null вручную. Это то, что вы бы сделали в противном случае, если бы не указали параметр. По умолчанию,

Однако их слабая маркировка имеет побочный эффект. Они могут раствориться в воздухе без вашего ведома. В конце концов, вы узнаете, но с точки зрения неприятной ошибки. Это то, что вызывает ваши проблемы? Может быть, а может и нет. Придется поэкспериментировать. Кроме того, будет полезно, если вы предоставите нам более подробную информацию, например, точный код ошибки, какой-либо источник.

Надеюсь это поможет. Приятного сгибания :)

Ответ на ваш вопрос, и я понимаю, что у вас была проблема с областью действия, потому что я только что ответил на ваш вопрос по области действия, заключается в том, что вы работаете со сценой. Считайте сцену глобальной, так как это холст, на котором отрисовываются все ваши экранные объекты.

Следующее будет работать везде !!!

stage.addEventListener(Event.ENTER_FRAME, setScrollPercent, false, 0, true);

Теперь ошибка, о которой вы говорите, IM GUESSING, заключается в том, что вы просто установили вышеупомянутое значение removeEventListener, когда вы были готовы, что не сработает.

Функция removeEventListener НЕ ПРИНИМАЕТ пять параметров, таких как ее аналог addEventListener, она позволяет игнорировать только три параметра приоритета и слабую ссылку, как показано ниже.

//The following removes YOUR stage Event.ENTER_FRAME listener from any scope.
stage.removeEventListener(Event.ENTER_FRAME, setScrollPercent, false);

Надеюсь, это поможет, помните, что этап - это в некотором смысле глобальный корень, и будьте осторожны с корнем, на самом деле он работает так, как должен, в том факте, что вызов root теперь относится к swf, из которого вы его вызываете, а не к этапу , если только этап не является корнем текущей области.

Вы должны иметь возможность просто использовать свою старую функцию и использовать removeEventListeners вместо add. На самом деле довольно просто.

Какие ошибки вы видите? Уровень вложенности не должен иметь к этому никакого отношения, поскольку слушатели просто регистрируются параметрами, поэтому, пока вы вызываете remove с теми же тремя ключевыми параметрами, которые вы использовали для добавления, все должно быть в порядке.

Ваш настоящий вопрос, как получить ссылку на объект слушателя во внешнюю область? Если это так, существует несколько возможных решений, и лучший способ сделать это зависит от структуры вашего кода.

- MarkusQ