Форум программистов, компьютерный форум, киберфорум
ActionScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
20 / 20 / 3
Регистрация: 16.10.2013
Сообщений: 295
AS 3.0

Удаление слушателя

18.11.2014, 21:23. Показов 1977. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть у меня некий класс, структура такая:
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package Data.CLASSES.PLATFORMS
{
    //...........импорты
    
    public class PLATFORM_KILL extends Sprite
    {
        public function PLATFORM_KILL(container:Sprite, x:Number, y:Number, w:Number, h:Number, obj:Object)
        {
 
            //.....создаю тело Бокс2д
            ....
 
//
            addEventListener("stop", f_stop);
 
        }
        
        //---------------------------------------------------------
        private function f_stop(e:Event):void {
            //.....делаю что-то
 
            removeEventListener("stop", f_stop);
        }
    
    }
}
Так вот, вопрос: как коректно подчистить слушатель, если класс обнулился а не через диспатчер(рестарт уровня). Думал на ремув фром стейдж вешать очистку, но я не помещаю сам класс на сцену.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.11.2014, 21:23
Ответы с готовыми решениями:

Как грамотно поставить слушателя на функцию?
Как нужно поставить слушателя на функцию, чтобы она выполнилась ТОЛЬКО ТОГДА, когда произошло изменение значение какой-либо переменной, а...

Ошибка слушателя
Всем привет. Недавно начал учить Java и столкнулся с одной проблемой при написании калькулятора: в классе CalculatorEngine выдает ошибку в...

SWT: Удалить слушателя
Предположим, у меня есть класс, объекты которого умеют генерить и добавлять специфического слушателя (отдельный класс, имплементящий...

24
bus
34 / 34 / 3
Регистрация: 17.05.2014
Сообщений: 144
18.11.2014, 21:25
Круто!
Он и так удалится, контекст, то есть, таргет остается тот же.
0
20 / 20 / 3
Регистрация: 16.10.2013
Сообщений: 295
18.11.2014, 21:28  [ТС]
Или гарбейдж коллектор сам нормально почистит висяковый слушатель?
0
bus
34 / 34 / 3
Регистрация: 17.05.2014
Сообщений: 144
18.11.2014, 21:31
Висяк удалит, если Вы удалите класс PLATFORM_KILL
0
20 / 20 / 3
Регистрация: 16.10.2013
Сообщений: 295
18.11.2014, 21:36  [ТС]
Цитата Сообщение от bus Посмотреть сообщение
Он и так удалится, контекст, то есть, таргет остается тот же
Если его удалит сам сборщик мусора, тогда зачем все советуют вручную всегда подчищать слушатели?

Добавлено через 1 минуту
Цитата Сообщение от bus Посмотреть сообщение
Висяк удалит, если Вы удалите класс PLATFORM_KIL
Сам класс не удаляю, ибо создаю его екземпляр без присвоения переменной а просто new PLATFORM_KILL();
0
bus
34 / 34 / 3
Регистрация: 17.05.2014
Сообщений: 144
18.11.2014, 21:39
Если экземпляр не удаляется, значит и слушатель не удаляется и его нужно вручную.
А советуют так, потому лучше все самому контролировать, чем полагаться на незнание.
0
20 / 20 / 3
Регистрация: 16.10.2013
Сообщений: 295
18.11.2014, 21:43  [ТС]
Цитата Сообщение от bus Посмотреть сообщение
Если экземпляр не удаляется, значит и слушатель не удаляется и его нужно вручную.
А советуют так, потому лучше все самому контролировать, чем полагаться на незнание.
Вернулись к началу темы Как адекватно подчистить этот слушатель, если сам класс на сцену не добавляется, класс сам по себе просто создает тела физ движка Box2d. Удалять екземпляр не выйдет, так как таких екземпляров несколько десятков на уровне (платформы) и переменных ссылающих на эти экземпляры нету.
0
bus
34 / 34 / 3
Регистрация: 17.05.2014
Сообщений: 144
18.11.2014, 21:48
Вы уже его удаляете.
Или явно удаляйте с event.target
0
20 / 20 / 3
Регистрация: 16.10.2013
Сообщений: 295
18.11.2014, 22:09  [ТС]
Цитата Сообщение от bus Посмотреть сообщение
Вы уже его удаляете.
Или явно удаляйте с event.target
В моем примере я слушатель удаляю если было задиспатчено событие на этот экземпляр. А вопрос в том , как почистить его если диспатча небыло и я просто вышел с уровня. В итоге был создан экземпляр new PLATFORM_KILL() c 1 слушателем без ссылок на него и он так и остается висеть в памяти? Вобщем может я зря фигней голову ломаю и ГК сам почистит этот слушатель?

Добавлено через 2 минуты
Интересная деталь со справки: Параметр useWeakReference позволяет указать, является ли ссылка на функцию прослушивателя слабой или нормальной. Выбор значения true для этого параметра позволяет избежать ситуаций, при которых функции прослушивателя остаются в памяти, хотя они уже больше не нужны. Flash Player и AIR используют метод «сбора мусора», чтобы убрать из памяти объекты, которые больше не используются. Объект считается неиспользуемым, если на него больше не содержится ссылок. Сборщик мусора не учитывает слабые ссылки. Это означает, что функция прослушивателя, на которую указывает только слабая ссылка, имеет право быть подвергнутой «сбору мусора».

Мой пример является слабой ссылкой или что такое слабая ссылка?
0
bus
34 / 34 / 3
Регистрация: 17.05.2014
Сообщений: 144
18.11.2014, 22:19
Ваш пример не является. Вы же сами написали
Параметр useWeakReference
Где он у Вас?
Я могу сказать только одно - если Вас не волнуют ссылки на объекты и их судьба,
то не замарачивайтесь о слушателях, запорите одно-два приложения и возможно
потом до Вас дойдет, что все правила и советы придумали не просто так.
0
20 / 20 / 3
Регистрация: 16.10.2013
Сообщений: 295
18.11.2014, 22:26  [ТС]
Цитата Сообщение от bus Посмотреть сообщение
Параметр useWeakReference
Это 5 параметр addEventListener, который по умолчанию false.
Цитата Сообщение от bus Посмотреть сообщение
Я могу сказать только одно - если Вас не волнуют ссылки на объекты и их судьба
Какраз и заволновало, потому и пытаюсь найти истину.
Я правильео понимаю, что любой екземпляр созданый
ActionScript 3
1
new PLATFORM_KILL()
, а не
ActionScript 3
1
_class=new PLATFORM_KILL()
всеравно остается висеть в памяти с его слушателем пока я не выйду полностью с программы?
0
Модератор
 Аватар для TanaTiX
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
18.11.2014, 22:30
Wells77, а как вы удаляете объект, если не имеете на него явной ссылки? Просто removeChild? Если это единичный объект уровня, так можно и ссылку сохранить - тогда будете удалять его целенаправленно, а раз будет ссылка, то можно будет и метод создать для чистки слушателей.
Ну и да, можно использовать useWeakReference.
0
20 / 20 / 3
Регистрация: 16.10.2013
Сообщений: 295
18.11.2014, 22:49  [ТС]
Цитата Сообщение от TanaTiX Посмотреть сообщение
Wells77, а как вы удаляете объект, если не имеете на него явной ссылки? Просто removeChild? Если это единичный объект уровня, так можно и ссылку сохранить - тогда будете удалять его целенаправленно, а раз будет ссылка, то можно будет и метод создать для чистки слушателей.
Ну и да, можно использовать useWeakReference.
Да мне не нужны были ссылки на экземпляры этого объекта. Он просто в конструкторе создает физтело движка Box2d (Как-бы упрощенная оболочка для создания физтел). Сами физтела удаляются при выходе с уровня. Это не единственный обьект. На уровне таких может быть около сотни - это кирпичные платформы.

Добавлено через 11 минут
Вобщем я так понимаю, наверное нада заморочится и загнать все экземпляры new при создании в массив, прописать для каждого з таких похожих классов паблик функцию деструктора, где слушатели удаляться будут. Потом при выходе или рестарте уровня обойти сначала весь массив, вызвав для каждого элемента ф-цию деструктора и очистить в конце сам массив и прировнять до null. Или есть поинтереснее советы?
0
bus
34 / 34 / 3
Регистрация: 17.05.2014
Сообщений: 144
18.11.2014, 23:11
Лучший ответ Сообщение было отмечено Wells77 как решение

Решение

Понимаете, если на объект на котором висит слушатель, ничего не держит,
то он удалится и удалит слушатель. Но это произойдет только в том случаи
если внутри этого объекта не сохранен объект, на которого существует ссылка.

В объекте В сохранена ссылка на объект А,
на который ссылка есть в объекте С.
На В ссылок нет, но его удалить нельзя, так как
на объект А ссылка есть и если удалить В, то и А
удалится и по этому gc себе этого не позволит.

Теперь о слушателе, он находится внутри объекта
В и если удалить объект А, то на объект В больше ссылаться никто
не будет и он удалится вместе со слушателем.

От useWeakReference мне кажется в данном случаи нет смысла
я вообще не понимаю этот параметр... По идее, он должен работать так,
что если я в В подписал не сохраненный в нем объект А c указанием слабой ссылки,
то при удалении объекта В, он бы не держался на слушателе, а удалился бы.

Стало Вам ясно что нибудь из сказанного?) Наверное нет, так как это нужно в голове представлять.
Когда знаешь, то представляется, а когда нет, то просто головоломка какая-то.
0
Модератор
 Аватар для TanaTiX
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
18.11.2014, 23:19

Не по теме:

Цитата Сообщение от bus Посмотреть сообщение
Стало Вам ясно что нибудь из сказанного?) Наверное нет, так как это нужно в голове представлять.
Когда знаешь, то представляется, а когда нет, то просто головоломка какая-то.
Наверное потому и вопросы задают, что не знают, а форум для того, что бы помогать в их решении ;)


Wells77, а действительно есть необходимость создавать слушатели в каждом из объектов, да еще и включая те, которые не добавляются на сцену?
0
20 / 20 / 3
Регистрация: 16.10.2013
Сообщений: 295
18.11.2014, 23:33  [ТС]
Вот что я понял, надеюсь правильно. Скину для наглядности весь код моего класса и попробую обьяснить что понял:
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package Data.CLASSES.PLATFORMS
{
    import Box2D.Collision.Shapes.*;
    import Box2D.Dynamics.b2Body;
    import Box2D.Dynamics.b2BodyDef;
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import Box2D.Collision.Shapes.b2PolygonShape;
    import Box2D.Common.Math.b2Vec2;
    import flash.events.Event;
    
    import Data.CLASSES.EFFECTS.FIRE;
    
    import flash.display.DisplayObject;
    
    public class PLATFORM_KILL extends Sprite
    {
        public var _mc:DisplayObject;
        
        public function PLATFORM_KILL(container:Sprite, x:Number, y:Number, w:Number, h:Number, obj:Object)
        {
            var _body:b2Body; 
            var _bodyDef:b2BodyDef;
            var _shape:b2PolygonShape; 
            
            
            _bodyDef=new b2BodyDef();
            _bodyDef.type = b2Body.b2_staticBody;
            _bodyDef.position.Set(x/Box2DHelpers.meters, y/Box2DHelpers.meters);
            
            _bodyDef.userData=new Platform_userData();      
            
            _bodyDef.userData.name="platform_kill";
            
            _body=Box2DHelpers.world.CreateBody(_bodyDef);
            
            _shape=new b2PolygonShape();
            _shape.SetAsBox( w/Box2DHelpers.meters/2, h/Box2DHelpers.meters/2);
            _body.CreateFixture2(_shape);
            
            //Если нада установить управляемый визуальный эффект
            if (obj.fire) { //огонь
                _mc = new FIRE(x, y, 0.8, 0.4);
                obj.containerMc.addChild(_mc);
            }
            
            addEventListener("stop", f_stop);
 
        }
        
        //---------------------------------------------------------
        private function f_stop(e:Event):void {
            //.................
            removeEventListener("stop", f_stop);
 
        }
        
        
    }
}

Экземпляр new PLATFORM_KILL() с 1 слушателем удалится сам благодаря ГК только в том случае, если:
1)_bodyDef==null
2)_body==null
3)_shape==null
4) if (obj.fire) то и _mc==null

Вобщем пока хоть 1 переменная внутри экземпляра PLATFORM_KILL() не будет равна null, коллектор не удалит его.
В виду того, что можна запутаться и не всегда быть уверенным что все переменные будут ссылаться на null, правильно и рационально делать функции деструкторы для всех классов, где удаляются все слушатели даного экземпляра и сам екземпляр.

Я правильно понял???
0
bus
34 / 34 / 3
Регистрация: 17.05.2014
Сообщений: 144
18.11.2014, 23:38
Вам нужно о областях видимости почитать в книге и тогда Вы поймете,
как ведут себя переменные. Я не смогу объяснить лучше чем в книге.
0
20 / 20 / 3
Регистрация: 16.10.2013
Сообщений: 295
18.11.2014, 23:43  [ТС]
Цитата Сообщение от TanaTiX Посмотреть сообщение
Wells77, а действительно есть необходимость создавать слушатели в каждом из объектов, да еще и включая те, которые не добавляются на сцену?
Работая с бокс2д есть, так как само физ тело не принимает события, а только привязаный к нему спрайт или мувик. Следовательно для управления физтелами пришлось запихать их в классы-оболочки.

Добавлено через 1 минуту
Цитата Сообщение от bus Посмотреть сообщение
Вам нужно о областях видимости почитать в книге и тогда Вы поймете,
как ведут себя переменные. Я не смогу объяснить лучше чем в книге.
Значит я все неправильно понимаю? Или не совсем потеряный ?
0
bus
34 / 34 / 3
Регистрация: 17.05.2014
Сообщений: 144
18.11.2014, 23:53
Цитата Сообщение от Wells77 Посмотреть сообщение
Значит я все неправильно понимаю? Или не совсем потеряный
Я бы Вам не доверил что-либо делать... Вы не знаете самого минимума, без которого делать
что-то опасно. Но главное не писать, как некоторые "что я обижаю", а достойно отреагировать прочтением
пару глав книги и конвенций по коду as3 и после вернуться сюда, чтобы прочесть все ещё раз
и уже потом уточнять.
0
20 / 20 / 3
Регистрация: 16.10.2013
Сообщений: 295
19.11.2014, 00:02  [ТС]
Абсолютно нормально воспринимаю критику. Уже откопал пару статеек о области видимости, завтра займусь прочтением. Но все-же, неужели я неправильно понял, что объект удалится только в том случае, когда переменные внутри его будут все ссылаться на пустое место (null)?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.11.2014, 00:02
Помогаю со студенческими работами здесь

Получение данных из слушателя
Добрый день, помогите, совсем запутался в приведенном коде содержится модель с помощью JDialog необходимо загрузить данные из файла и...

Реализация общего слушателя
В программе есть 3 класса: интерфейс пользователя (jPanel), класс рабочего объекта и главное окно (jFrame с экземплярами интерфейса и...

Автоматическое добавление слушателя
Всем привет... Недавно возникла проблема.... Когда программа запускается то автоматически размещает на форме jCheckBox. Мне надо...

Исключения в методе слушателя
Я пишу пытаюсь написать калькулятор для подсчета длины спиц на велосипедном колесе, при нажатии на баттон при условии заполненных полей...

Заморочка слушателя мыши
import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru