|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Как в объекте узнать ссылки на функции-обработчики
Здравствуйте. Для обработки ентерфреймов использую синглтон (класс прилагается ниже). Как нам известно - когда вешаешь слушатель события на объект (в моем случае на экземпляр синглтона), то ссылки на обработчики событий сохраняются в этом объекте в некоем списке. Как получить этот список?
Дело в том, что если в приложении навесить 40 слушателей на синглтон, гипотетически может быть такое, что я забуду отписаться от какого-то события. Допустим, игра закончена, удалена со сцены, ссылки обнулены, перешли в главное меню. Но ведь этот глобальный диспетчер содержит ссылку в своем списке на объект, в котором я забыл отписаться от события. И может быть такое, что GC не уберет этот объект из памяти. Так вот как можно отписаться от ВСЕХ слушателей, которые были повешены на EnterFrameDispatcher.instance, но были забыты???: 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 { }
__________________
Я мало чего умею, но зато хорошо умею учиться... |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Создать новый instance?
__________________
Reality.getBounds(this); |
|
|||||
Угу, переопределять addEventListener, removeEventListener. При addEventListener - добавлять в словарик "[тип события][набор функций]" - при removeEventListener - удалять,
а при вызове метода clear - пройтись по всем и super.removeEventListener(type, functionI); Только вот одного не пойму - у вас же этот диспетчер глобальный и одинокий. Как вы будете отписываться "чтобы на верняка", всмыслке как вы будете clear() вызывать? Вызывал clear() и _всё_ приложение перестало работать? Всмысле какая польза отписки всего? И как понять _когда_ это всё надо отписывать? Хотя... Если запускается уровень игры а потом выходим из уровня, чтобы старый уровень _точно_ не мучал процессор вызываем clear(), а потом вызваем только после завершения следующего уровня... Последний раз редактировалось expl; 26.05.2012 в 21:44. |
|
|||||
Спасибо всем. Совет Wolsh более простой, mayakwd и expl немного сложнее, но тоже проблем не составит.
Именно! Я пишу приложения независимыми блоками. При изменении блока (меню, игра, и т.д.) я полностью старое удаляю и создаю новое.
__________________
Я мало чего умею, но зато хорошо умею учиться... |
|
|||||
Кстати, данный пост заставил задуматься над следующим: в дебаггере я вижу массив listeners, который содержит набор слушателей событий для данного объекта. Так вот попытки обратиться к этому массиву, например так:
или так или так выводят undefined, или отсутствующее свойство для 3-го случая, хотя объект создан, находится на сцене и имеет слушатели. А обращаться к этому массиву было бы полезно в таких случаях как в этой теме. Так вот интересно почему я не могу обратиться к массиву listeners? И еще стало интересно как работает функция hasEventListeners, наверняка же она обращается к списку слушателей? |
|
|||||
Он приватный для EventDispatcher, соответственно он там глубоко есть, а доступа к нему нет ни у наследников ни у сторонних объектов. Если интересно то достучаться до него можно только в дебаговом плеере через flash.sampler::getMemberNames(), он вернёт объект с хитрыми QName от которых можно добыть ссылку на этот массив. Но только в дебаговом плеере, не вздумайте применять в продакшене. Вот пост на английском языке с подробностями. Я пробовал сгенерить такой QName руками, но мне не удалось, что-то внути него ещё есть, или он тупо по адресу в памяти это проверяет.
__________________
:) Последний раз редактировалось Aquahawk; 29.05.2012 в 20:18. |
Часовой пояс GMT +4, время: 18:15. |
|
« Предыдущая тема | Следующая тема » |
|
|