2009-02-25 3 views
1

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

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

ответ

5

Лучшие практики с AS eventlisteners являются:

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

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

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

Надеюсь, это поможет. Happy flexing :)

+0

Вы можете добавить пример? Я новичок в AS3, и я действительно не знаю, что означает слабый. –

1

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

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

- MarkusQ

0

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

Следующие будут работать в любом месте !!!

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

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

Функция removeEventListener НЕ принимает пять параметров, таких как его дочерний элемент addEventListener, он позволяет только три игнорировать приоритет и слабую ссылку, как показано ниже.

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

надеюсь, что это помогает, помните, что этап глобального корня в некотором смысле, и быть осторожным корень, он на самом деле работает, как предполагается в настоящее время в том, что вызов корень теперь по отношению к ФНБ вас вызовите его, а не этап, если только сцена не является корнем текущей области.

0

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

Смежные вопросы