![]() |
Как в объекте узнать ссылки на функции-обработчики
Здравствуйте. Для обработки ентерфреймов использую синглтон (класс прилагается ниже). Как нам известно - когда вешаешь слушатель события на объект (в моем случае на экземпляр синглтона), то ссылки на обработчики событий сохраняются в этом объекте в некоем списке. Как получить этот список?
Дело в том, что если в приложении навесить 40 слушателей на синглтон, гипотетически может быть такое, что я забуду отписаться от какого-то события. Допустим, игра закончена, удалена со сцены, ссылки обнулены, перешли в главное меню. Но ведь этот глобальный диспетчер содержит ссылку в своем списке на объект, в котором я забыл отписаться от события. И может быть такое, что GC не уберет этот объект из памяти. Так вот как можно отписаться от ВСЕХ слушателей, которые были повешены на EnterFrameDispatcher.instance, но были забыты???: Код AS3:
|
Создать новый instance?
|
Переопределить методы работы с событиями, и самостоятельно сохранять ссылки на обработчики, после чего и вызывать super.методы.
|
Угу, переопределять addEventListener, removeEventListener. При addEventListener - добавлять в словарик "[тип события][набор функций]" - при removeEventListener - удалять,
а при вызове метода clear - пройтись по всем и super.removeEventListener(type, functionI); Только вот одного не пойму - у вас же этот диспетчер глобальный и одинокий. Как вы будете отписываться "чтобы на верняка", всмыслке как вы будете clear() вызывать? Вызывал clear() и _всё_ приложение перестало работать? Всмысле какая польза отписки всего? И как понять _когда_ это всё надо отписывать? Хотя... Если запускается уровень игры а потом выходим из уровня, чтобы старый уровень _точно_ не мучал процессор вызываем clear(), а потом вызваем только после завершения следующего уровня... |
Спасибо всем. Совет Wolsh более простой, mayakwd и expl немного сложнее, но тоже проблем не составит.
Цитата:
|
Кстати, данный пост заставил задуматься над следующим: в дебаггере я вижу массив listeners, который содержит набор слушателей событий для данного объекта. Так вот попытки обратиться к этому массиву, например так:
Код AS3:
Код AS3:
Код AS3:
|
Он приватный для 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
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.