Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как в объекте узнать ссылки на функции-обработчики (http://www.flasher.ru/forum/showthread.php?t=180069)

HardCoder 26.05.2012 21:23

Как в объекте узнать ссылки на функции-обработчики
 
Здравствуйте. Для обработки ентерфреймов использую синглтон (класс прилагается ниже). Как нам известно - когда вешаешь слушатель события на объект (в моем случае на экземпляр синглтона), то ссылки на обработчики событий сохраняются в этом объекте в некоем списке. Как получить этот список?
Дело в том, что если в приложении навесить 40 слушателей на синглтон, гипотетически может быть такое, что я забуду отписаться от какого-то события. Допустим, игра закончена, удалена со сцены, ссылки обнулены, перешли в главное меню. Но ведь этот глобальный диспетчер содержит ссылку в своем списке на объект, в котором я забыл отписаться от события. И может быть такое, что GC не уберет этот объект из памяти.
Так вот как можно отписаться от ВСЕХ слушателей, которые были повешены на EnterFrameDispatcher.instance, но были забыты???:
Код AS3:

package {
        import flash.display.Shape;
 
        /**
        * @author HardCoder
        */

        public final class EnterFrameDispatcher extends Shape {
                private static var _instance:EnterFrameDispatcher = null;
 
                public static function get instance():EnterFrameDispatcher {
                        if (!_instance)
                                _instance = new EnterFrameDispatcher(new EnterFrameDispatcherKey());
                        return _instance;
                }
 
                public function EnterFrameDispatcher(key:EnterFrameDispatcherKey) {
                        if (!key)
                                throw new ArgumentError("Key needed to create an instance!");
                }
        }
}
 
internal final class EnterFrameDispatcherKey {
}


Wolsh 26.05.2012 21:26

Создать новый instance?

mayakwd 26.05.2012 21:27

Переопределить методы работы с событиями, и самостоятельно сохранять ссылки на обработчики, после чего и вызывать super.методы.

expl 26.05.2012 21:39

Угу, переопределять addEventListener, removeEventListener. При addEventListener - добавлять в словарик "[тип события][набор функций]" - при removeEventListener - удалять,
а при вызове метода clear - пройтись по всем и super.removeEventListener(type, functionI);

Только вот одного не пойму - у вас же этот диспетчер глобальный и одинокий. Как вы будете отписываться "чтобы на верняка", всмыслке как вы будете clear() вызывать?
Вызывал clear() и _всё_ приложение перестало работать?
Всмысле какая польза отписки всего? И как понять _когда_ это всё надо отписывать?

Хотя...
Если запускается уровень игры а потом выходим из уровня, чтобы старый уровень _точно_ не мучал процессор вызываем clear(), а потом вызваем только после завершения следующего уровня...

HardCoder 26.05.2012 21:49

Спасибо всем. Совет Wolsh более простой, mayakwd и expl немного сложнее, но тоже проблем не составит.
Цитата:

Сообщение от expl (Сообщение 1081568)
Хотя...
Если запускается уровень игры а потом выходим из уровня, чтобы старый уровень _точно_ не мучал процессор вызываем clear(), а потом вызваем только после завершения следующего уровня...

Именно! Я пишу приложения независимыми блоками. При изменении блока (меню, игра, и т.д.) я полностью старое удаляю и создаю новое.

PainKiller 27.05.2012 00:59

Кстати, данный пост заставил задуматься над следующим: в дебаггере я вижу массив listeners, который содержит набор слушателей событий для данного объекта. Так вот попытки обратиться к этому массиву, например так:
Код AS3:

trace (mc.listeners);

или так
Код AS3:

trace (mc.listeners[0]);

или так
Код AS3:

trace (mc.listeners.length);

выводят undefined, или отсутствующее свойство для 3-го случая, хотя объект создан, находится на сцене и имеет слушатели. А обращаться к этому массиву было бы полезно в таких случаях как в этой теме. Так вот интересно почему я не могу обратиться к массиву listeners? И еще стало интересно как работает функция hasEventListeners, наверняка же она обращается к списку слушателей?

Aquahawk 27.05.2012 01:41

Он приватный для EventDispatcher, соответственно он там глубоко есть, а доступа к нему нет ни у наследников ни у сторонних объектов. Если интересно то достучаться до него можно только в дебаговом плеере через flash.sampler::getMemberNames(), он вернёт объект с хитрыми QName от которых можно добыть ссылку на этот массив. Но только в дебаговом плеере, не вздумайте применять в продакшене. Вот пост на английском языке с подробностями. Я пробовал сгенерить такой QName руками, но мне не удалось, что-то внути него ещё есть, или он тупо по адресу в памяти это проверяет.


Часовой пояс GMT +4, время: 00:19.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.