Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   множественное добавление и удаление слушателей, хочу понять нюансы (http://www.flasher.ru/forum/showthread.php?t=212484)

neonoviiwolf 23.02.2016 16:22

множественное добавление и удаление слушателей, хочу понять нюансы
 
Доброго!
Давно заметил, что если написать к примеру так
Код AS3:

                        this.addEventListener(Event.ADDED_TO_STAGE, init);
                        this.removeEventListener(Event.ADDED_TO_STAGE, init);
                        this.removeEventListener(Event.ADDED_TO_STAGE, init);

то компилятор не будет ругаться.
Видимо, если слушатель удалён, то он просто игнорирует

Так вот, отсюда вопрос

Код AS3:

this.addEventListener(Event.ADDED_TO_STAGE, init);
this.addEventListener(Event.ADDED_TO_STAGE, init);

если сделать к примеру так, то создадутся 2 слушателя или один?

хочу это знать, возможно поможет искать не очевидные ошибки

Tails 23.02.2016 16:25

http://help.adobe.com/ru_RU/FlashPla...ventListener()

neonoviiwolf 23.02.2016 16:44

там про это не сказано, лишь обмолвились тем, что будет создано два события, если useCapture у них разный

Добавлено через 8 минут
просто есть момент в коде, работает всё нормально, но ели создаётся 2 события, то у меня выходит утечка памяти, хотя и крайне медленная, если нет, то всё хорошо.

Tails 23.02.2016 17:14

Что-то вы путаетесь, уважаемый, наверное не до конца понимаете как оно работает.
1. Есть событие.
2. Есть слушатель.

Событие - объект Event, созданный где-то в коде и отправленный на дисптечеризацию.
Слушатель - связка "Событие" + "функция", которую хранит диспетчер. (EventDispatcher)

Пишем так:
Код AS3:

var d:EventDispatcher = new EventDispatcher();
 
d.addEventListener("myEvent", onEventCallback1);
d.addEventListener("myEvent", onEventCallback2);
 
// Слушатель 1
function onEventCallback1(e:Event):void {
    trace("Слушатель 1");
}
// Слушатель 2
function onEventCallback1(e:Event):void {
    trace("Слушатель 2");
}
 
// Пуляем ОДНО событие:
d.dispatchEvent(new Event("myEvent"));

В итоге программа выдаст:
Цитата:

Слушатель 1
Слушатель 2
При этом произошла диспетчеризация одного события, но были вызваны два разных слушателя, которые приняли одно и тоже событие.
Если сделать вот так:
Код AS3:

d.addEventListener("myEvent", onEventCallback1);
d.addEventListener("myEvent", onEventCallback1);

Будет только один вызов, так-как вы уже подписали функцию onEventCallback1 на событие "myEvent".
В справке об этом сказано.

neonoviiwolf 23.02.2016 17:37

я понимаю, что вызов будет один, вопрос в том, создадутся ли 2 слушателя или флеш, увидев, что объект уже подписан на это событие, не станет создавать его повторно

Tails 23.02.2016 17:47

Слушатель будет только один

caseyryan 23.02.2016 21:42

Слушатели добавляются в хэш карту. Ее фишка в том, что ключи повторяться не могут, каждый ключ уникален, в отличие от простого массива. А так как ключем там выступает ссылка на метод-обработчик, то для одного метода может быть зарегистрирован только один слушатель. Так что сколько бы ты раз не писал добавление слушателя для одного типа события и одного обработчика, он все равно будет создан только в единственном экземпляре.

neonoviiwolf 23.02.2016 22:53

caseyryan спасибо за развёрнутый ответ


Часовой пояс GMT +4, время: 02:27.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.