Руководство по actionscript. часть 2, стр. 049
Будьте осторожны при изменении порядка выполнения приемников событий. Программы, зависящие от порядка выполнения, предрасположены к ошибкам, поскольку приоритеты приемников событий являются непостоянными, усложняют поддержку кода и делают его более сложным для восприятия.
Приемники событий и управление памятью
В этой главе мы увидели, что событийная модель языка ActionScript основывается на приемнике (представляющем собой функцию или метод) и объекте, в котором регистрируется этот приемник. Каждый объект, регистрирующий приемник для определенного события, поддерживает связь с этим приемником, сохраняя ссылку на него во внутреннем массиве, который называется списком приемников. Например, в следующем коде (взятом из листинга 12.1) метод completeListener ( ) регистрируется в объекте urlLoader для событий Event. COMPLETE. В результате внутренний список приемников объекта ur lLoader получает ссылку на метод completeListener ( ).
package { import flash. display.*; import flash. net.*; import flash. events.*;
public class FileLoader extends Sprite { public function FileLoader ( ) { var urlLoader:URLLoader = new URLLoaderC );
// Регистрация приемника completeListener( )
url Loader. addEventLi stener(Event. COMPLETE, completeLi stener);
urlLoader.1oad(new URLRequestC»someFi1e. txt»));
private function completeListener (e:Event):void { traceC’Load complete»);
}
}
}
По умолчанию любой объект, получивший ссылку на приемник, хранит ее до тех пор, пока регистрация данного приемника не будет явно отменена методом removeEventListener ( ). Более того, объект продолжает хранить полученную ссылку на приемник даже тогда, когда в программе не остается других ссылок на этот приемник. Это демонстрирует следующий простой класс AnonymousLi stener. Он создает анонимную функцию и регистрирует ее для событий MouseEvent. MOUSE_EVENT в экземпляре Stage клиентской среды выполнения Flash. Хотя класс AnonymousLi stener не имеет ссылок на эту анонимную функцию, она продолжает храниться в экземпляре Stage и вызывается каждый раз при возникновении события MouseEvent. MOUSE MOVE, даже спустя долгое время после завершения метода конструктора класса AnonymousListener.