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

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

18.11.2014, 21:23. Показов 1932. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru