![]() |
Отписывание от событий
Всем доброго дня!
Всё таки довольно таки странный вопрос, но мне хочется как бы всё по правильному. Вот обычный код для каждой программы: Код AS3:
Код AS3:
Код AS3:
|
Используйте мягкие ссылки, названия методов - с маленькой буквы.
Какая необходимость в использовании метода Start? |
TanaTiX
Цитата:
Цитата:
Цитата:
|
А в чем смысл флажка isAddedToStageListener? Отписываемся если он true, но если false то по коду OnAddedToStage и не придет...
|
Stitch512
Согласен! Упустил из виду. Тут значит проблем нет. Раз вызвалась, значит подписывались и всегда можно отписывать. Косяк мой. Тогда у меня 3 вопроса: 1. Что за мягкие ссылки? 2. Можно ли отписывать событие, если оно не было подписано (что вообще будет?) 3. delete используется для удаления полей в динамическом классе, а можно ли как-то удалить сам динамический класс из памяти (я конечно понимаю что он сам удалится со временем если на него нет ссылок, но а самом можно?)? |
Цитата:
Цитата:
|
Под мягкими ссылками видимо имеется ввиду параметр "useWeakReference" в методе:
addEventListener(Event.ADDED, listener, false, 0, true); GC вроде как не учитывает слабые ссылки и по своему усмотрению может удалить завалявшийся слушатель. Но здесь не подходящий случай имхо. |
>> 1. Что за мягкие ссылки?
Код AS3:
Код AS3:
Ну это не плюсы, тут виртуальная машина всё решает. Всё что мы можем сделать это занулить все ссылки на объект дабы повысить вероятность очистки. Вручную сборщик мусора запускать не рекомендуется. справка |
Цитата:
Цитата:
На остальное вроде ответили. Добавлено через 1 минуту Dukobpa3, по 2-му пункту согласен с in4core |
Люди, откуда такая мантра: "не отписался от события - утекла память".
Подписка подразумевает, что мы создаем ссылку на слушатель внутри dispatcher-a. Если dispatcher и владелец слушателя - одно и то же лицо - память никуда не потечёт. Самый простой эксперимент - создаем класс-наследник Sprite, внутри вешаем trace на ENTER_FRAME в конструкторе. Создаем этот класс и удаляем на него ссылки. Наблюдаем некоторое время приход трейсов. Запускаем GC - трейсы пропали. В принципе, можно даже просто подписаться на спрайт и не создавать на него ссылок нигде - то же самое будет (он на нас ссылается, а мы на него - нет). Но от ENTER_FRAME как раз надо отписываться - ибо нефиг процессор грузить пока до тебя GC добирается. А вешаться на события на мягких ссылках не стоит по одной причине: - все время, пока GС будет добираться до объекта - объект будет исправно обрабатывать события - грузить проц тобишь. |
Цитата:
|
Ребят, всем спасибо за ответы. У меня вопрос по стилю ведения проекта (чтобы новой темы не создавать). Я как-то от C++ приучился. Вот главным классом у меня всегда является main.as, он не лежит ни в каком пространстве имён. Далее я решил создать пакет Game и в него впихнуть класс Game. Получилось вот так:
Код:
Game/Game.asКод AS3:
Код:
Game/... |
s3dworld
Цитата:
|
Извиняюсь, создаю новую тему...
|
Цитата:
|
Мягкие ссылки не отменяют отписывание от событий.
|
Согласен. Лично я не всегда доверяю мягким ссылкам и отписываюсь от событий в явном виде. А что - перестраховаться не помешает. Это вырабатывает привычку, чтобы потом не искать утечки.
|
Цитата:
Да, с мягкими оно надежнее - вдруг не отпишешься - хотя бы GC пусть и через некоторое время, но снесёт. Однако это напоминает выдачу парашютов пилотам пассажирского лайнера - а чё? - на пару жертв меньше зато будет. Ведь если вы забыли отписаться и ссылка была _не_ мягкой - это обнаружить будет проще, чем если бы ссылка была мягкой. Подход спорный, на абсолютную истинность не претендую. А слушать или не слушать Adobe - это зависит от Вашего подхода к управлению памятью в приложении в целом. |
Цитата:
Да, в конструкторе класса приложения переменная stage доступна, но ADDED_TO_STAGE сработает в любом случае после конструктора, поэтому достаточно написать так: Код AS3:
|
Цитата:
Цитата:
Цитата:
Цитата:
|
2TanaTiX
Обнаруживается стандартными средствами: трейсами, дебаггером, профайлером. Просто если выставлена мягкая ссылка - ты нажмешь run gc в профайлере и не увидишь что от чего-то не отписался. А использовать или не использовать мягкие ссылки: 1. Eсть ситуации, в которых отследить время, в которое надо удалить объект из словаря или отписать от события определить очень тяжело (в сущности надо будет релизовать маленкий GC на базе подсчета ссылок). Тут выбора и нет. Например видел ресурсный движок, который не заморачивался с выгрузкой ресурсов, а просто хранил все в Dictionary с мягкими ссылками (да, доверия к такой системе нет - а вдруг он через 1 секунду удалит, а нам ресурс опять потребовался - и опять грузи, т.е. нельзя настроить чтобы удалял через 30 секунд, например, но работала). Еще где-то в ASwing в каком-то менеджере компоненты пихаются в Dictionary со слабыми сылками. Там можно было от этого избавиться, но пришлось бы использовать совсем другой подход, т.е. можно считать у них не было выбора. 2. Большинство ситуаций не такие, в них ясно, когда отписывать объект. И тут просто 2 полюса: - отписаться, но перестраховаться слабыми ссылками - отписаться не перестраховываясь - если уж что-то идет не так - то это надо видеть Просто тяготею больше ко 2-му полюсу и все. 3. Не отписываться и везде слабых ссылок понавтыкать. Чревато нагрузкой на проц. |
Цитата:
1) Как-то не было у меня таких ситуаций и таких структур проектов... 2) У нас разные полюса :) Соглашусь, что оба имеют право на жизнь. 3) Это даже не вариант. |
| Часовой пояс GMT +4, время: 04:11. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.