Я пришел в AS3 из мира JS, и должен признаться, что анонимные функции - моя слабость. Я обычно использую их везде. Теперь, переходя к AS3 I ' Я слышал и читал во многих местах, что AS и Flash чрезвычайно плохо справляются со сборкой мусора, что следует очищать, утилизировать и удалять все обработчики событий и объекты вручную, чтобы избежать странных и необъяснимых утечек и сбоев памяти. Не уверен, что из этого правда, но я хотел бы с самого начала следовать передовым методам.
Итак, мой вопрос - насколько плоха идея использования анонимных функций в качестве обработчиков событий? Рассмотрим, например, такой код:
addEventListener(Event.ENTER_FRAME, function() : void {
controls.elapsed = stream.time;
});
contorls.elapsed - это установщик, который помимо установки текущего времени воспроизведения для видеоплеера, обновляет весь пользовательский интерфейс, а поток - это NetStream объект, передающий фактическое видео.
Есть много других мест, где анонимная функция может сделать код более чистым и интуитивно понятным. Проверьте следующий код на наличие простого эффекта постепенного появления на панели управления:
public function showControls() : void
{
var self:Controls = this;
if (!visible) {
visible = true;
fadeTimer = new Timer(30, 10);
fadeTimer.addEventListener(TimerEvent.TIMER, function() : void {
self.alpha += 0.1;
});
fadeTimer.addEventListener(TimerEvent.TIMER_COMPLETE, function() : void {
self.alpha = 1;
});
fadeTimer.start();
}
}
Мне очень нравится, как он выглядит и вписывается в код, но меня беспокоят утечки. Хотя обработчик Event.ENTER_FRAME, вероятно, никогда не стал бы вредным в этой форме, что насчет слушателей таймера. Должен ли я удалить этих слушателей вручную, или они будут удалены автоматически, как только я установлю fadeTimer = null ? Можно ли вообще правильно удалить слушателей с анонимными функциями?