|
|
|||||
Регистрация: Apr 2010
Сообщений: 170
|
Отписывание от событий
Всем доброго дня!
Всё таки довольно таки странный вопрос, но мне хочется как бы всё по правильному. Вот обычный код для каждой программы: package { import flash.display.MovieClip; import flash.events.Event; public class main extends MovieClip { public function main() { if(stage) Start(); else addEventListener(Event.ADDED_TO_STAGE,OnAddedToStage); } private function OnAddedToStage(_event:Event):void { removeEventListener(Event.ADDED_TO_STAGE,OnAddedToStage); Start(); } private function Start():void { } } } package { import flash.display.MovieClip; import flash.events.Event; public class main extends MovieClip { public function main() { if(stage) Start(); else addEventListener(Event.ADDED_TO_STAGE,OnAddedToStage); } private function OnAddedToStage(_event:Event):void { Start(); } private function Start():void { } } } package { import flash.display.MovieClip; import flash.events.Event; public class main extends MovieClip { private var isAddedToStageListener:Boolean=false; public function main() { if(stage) { Start(); } else { isAddedToStageListener=true; addEventListener(Event.ADDED_TO_STAGE,OnAddedToStage); } } private function OnAddedToStage(_event:Event):void { if(isAddedToStageListener) removeEventListener(Event.ADDED_TO_STAGE,OnAddedToStage); Start(); } private function Start():void { } } } |
|
|||||
Регистрация: Apr 2010
Сообщений: 170
|
TanaTiX
Цитата:
Цитата:
Цитата:
|
|
|||||
Регистрация: Nov 2010
Сообщений: 150
|
А в чем смысл флажка isAddedToStageListener? Отписываемся если он true, но если false то по коду OnAddedToStage и не придет...
|
|
|||||
Регистрация: Apr 2010
Сообщений: 170
|
Stitch512
Согласен! Упустил из виду. Тут значит проблем нет. Раз вызвалась, значит подписывались и всегда можно отписывать. Косяк мой. Тогда у меня 3 вопроса: 1. Что за мягкие ссылки? 2. Можно ли отписывать событие, если оно не было подписано (что вообще будет?) 3. delete используется для удаления полей в динамическом классе, а можно ли как-то удалить сам динамический класс из памяти (я конечно понимаю что он сам удалится со временем если на него нет ссылок, но а самом можно?)? |
|
|||||
[+4 06.05.14]
|
Цитата:
Цитата:
__________________
Марк Tween |
|
|||||
Регистрация: Jul 2011
Сообщений: 67
|
Под мягкими ссылками видимо имеется ввиду параметр "useWeakReference" в методе:
addEventListener(Event.ADDED, listener, false, 0, true); GC вроде как не учитывает слабые ссылки и по своему усмотрению может удалить завалявшийся слушатель. Но здесь не подходящий случай имхо. |
|
|||||
>> 1. Что за мягкие ссылки?
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, <b>useWeakReference:Boolean = trueb>):void hasEventListener(type:String):Boolean // Проверяет, имеет ли объект EventDispatcher прослушиватели, зарегистрированные для определенного типа события. Ну это не плюсы, тут виртуальная машина всё решает. Всё что мы можем сделать это занулить все ссылки на объект дабы повысить вероятность очистки. Вручную сборщик мусора запускать не рекомендуется. справка
__________________
Кто к нам с чем для чего - тот у нас того от того. |
|
|||||
Цитата:
Цитата:
На остальное вроде ответили. Добавлено через 1 минуту Dukobpa3, по 2-му пункту согласен с in4core
__________________
Ну все, теперь Забава м-о-я. Гы-гы, а корабль мой! |
|
|||||
Люди, откуда такая мантра: "не отписался от события - утекла память".
Подписка подразумевает, что мы создаем ссылку на слушатель внутри dispatcher-a. Если dispatcher и владелец слушателя - одно и то же лицо - память никуда не потечёт. Самый простой эксперимент - создаем класс-наследник Sprite, внутри вешаем trace на ENTER_FRAME в конструкторе. Создаем этот класс и удаляем на него ссылки. Наблюдаем некоторое время приход трейсов. Запускаем GC - трейсы пропали. В принципе, можно даже просто подписаться на спрайт и не создавать на него ссылок нигде - то же самое будет (он на нас ссылается, а мы на него - нет). Но от ENTER_FRAME как раз надо отписываться - ибо нефиг процессор грузить пока до тебя GC добирается. А вешаться на события на мягких ссылках не стоит по одной причине: - все время, пока GС будет добираться до объекта - объект будет исправно обрабатывать события - грузить проц тобишь. Последний раз редактировалось expl; 30.01.2012 в 14:47. |
Часовой пояс GMT +4, время: 10:21. |
|
« Предыдущая тема | Следующая тема » |
|
|