Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   fl.transitions.TweenEvent.MOTION_FINISH по совершению, нужно удалять listener? (http://www.flasher.ru/forum/showthread.php?t=140915)

джонатан 10.06.2010 19:23

fl.transitions.TweenEvent.MOTION_FINISH по совершению, нужно удалять listener?
 
Здрасьте, простите если вопрос глупый, только второй день тыркаюсь в АС3, пока не все понятно, не могу понять, нужно ли удалять слушатель, или он сам удаляется?

Спасибо за внимание.

AlexDesinger 10.06.2010 19:31

я удаляю.

КорДум 10.06.2010 20:06

С чего вы взяли, что слушатель сам удаляется?

джонатан 10.06.2010 20:08

по логике вещей, почему бы не удалиться самому той вещи которая уже выполнена. :) Да и в примерах в хелпе я как-то не увидел ничего такого.

КорДум 10.06.2010 20:11

После уничтожения объекта (не важно какого) все слушатели, таймеры, присоединенные к нему, остаются и работают. Так что только чистить самому.

джонатан 10.06.2010 21:16

Понял, спасибо.

nachalnik 25.06.2010 11:59

Цитата:

Сообщение от КорДум (Сообщение 914565)
После уничтожения объекта (не важно какого) все слушатели, таймеры, присоединенные к нему, остаются и работают. Так что только чистить самому.

То есть , раз слушатель объекта не уничтожается, то остается и ссылка на объект в самом слушателе (e.target.obj). Раз ссылка остается, то и объект остается не выгруженным из памяти. А уничтожая объект с помощью removeChild и присвоением переменной имеющей ссылку на этот объект значения null, но не удаляя слушатели объекта мы по сути не удаляем объект полностью , и он будет тихо и незаметно жить и жрать ресурсы.
Я ВЕРНО МЫСЛЮ ИЛИ ОШИБАЮСЬ? может есть ссылочка почитать об этом подробно?
(вот тут читал и здесь . Но насчет слушателей здесь ничего вроде нет

-De- 25.06.2010 12:37

Мыслите верно. Надо ещё прочитать про weak references (слабые ссылки), что-то не нашел по ссылкам про них.
Ещё конкретней - параметры конструктора Dictionary и то, что имеет непосредственное отношение к теме - параметры addEventListener.
Так вот - врачи рекомендуют (если вы не извращенец и не используете анонимные функции и даже в этом случае можно исхитриться) 5-й параметр всегда ставить в true.
Тогда когда удалится ссылка на обьект, то лангольеры сожрут и его и его слушатели.

AlexDesinger 25.06.2010 12:44

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

nachalnik 25.06.2010 12:47

спасибо за указание пути. погружаюсь в поиски инфы

КорДум 25.06.2010 14:39

Так-так-так. Всегда по старинке чистил все последовательно: удалить из отображения, убить слушателей, занулить ссылку. А тут, оказывается, можно и не убивать слушателей, ибо можно поставить пятый параметр в логическую единицу. Ага. Итого мы имеем экономию в строчках.
Хм, Николай Мукк'офф, помнится, писал, мол, слабые ссылки хороши, но не всегда. Мол, слушатели могут удалиться в ненужный момент, потому что ГЦ так пожелал. Я не прав?

-De- 25.06.2010 15:24

Я не агитирую за неудаление руками слушателей, я за то, чтоб использовать слабые ссылки в слушателях как страховку на случай, если забудут/будет неудобно руками удалять. Плюс пока GC не съест слушателя - он может вызываться и жрать проц(ну в случае мышиных евентов не будет, понятно).
Если в слушателе используется анонимная функция, единственная ссылка на которую - в слушателе, то GC её в "ненужный момент" съест. Это есть (и это описано в доке). В остальном - всё ок (или есть баг, что очень врядли).

КорДум 25.06.2010 15:36

Ага. А то я испугался уже, что пропустил облегчение жизни кодера из виду. А тут простая подстраховка.

Сайлас 25.06.2010 15:44

Не всегда работает стабильно слабая ссылка, слушатели слетают раньше времени часто в случае локальных переменных (даже на сцене когда они)

-De- 25.06.2010 16:45

Пример бы, это тогда баг, а что-то не нарыл я про такое.
Не бывает локальных DisplayObject'ов, бывают локальные ссылки на них. И в случае добавления их на сцену добавляется нормальная ссылка. Получается какая-то "полуслабая" ссылка - обьект на сцене не мрёт, а слушатель - мрёт.

КорДум 25.06.2010 18:44

Ага, нашел:
[IMG]http://s40.***********/i090/1006/0d/1410bda9d883t.jpg[/IMG]
Это не в упрек, это просто информативная выдержка из книги. А двумя страницами ранее было сказано про опасность анонимных функций и слабые ссылки как помощники в их удалении.

AlexDesinger 28.06.2010 11:10

и охота вам доверять и без того не совсем "умному" GC с слабыми ссылками, он и так чистит как ему нравиться, а вы ему еще такие важные вещи хотите доверить.
Нет, с листенерами нада все четко - в нужном месте поставили, пропала необходимость, сообщили товарищу из уборочного бюро - "приберите тут как только у вас появиться свободная минутка" и все...иначе кучи багов не избежать, все это ИМХО на личном опыте.

Psycho Tiger 28.06.2010 11:25

Цитата:

Сообщение от КорДум (Сообщение 914565)
После уничтожения объекта (не важно какого) все слушатели, таймеры, присоединенные к нему, остаются и работают. Так что только чистить самому.

Не совсем. Он остается, но до вызова GC.
Все удаления "руками" слушателей нужны чтобы "сэмулировать" удаление, само удаление произойдет по воле GC.

КорДум 28.06.2010 14:50

Цитата:

Сообщение от Psycho Tiger (Сообщение 918520)
Не совсем. Он остается, но до вызова GC.
Все удаления "руками" слушателей нужны чтобы "сэмулировать" удаление, само удаление произойдет по воле GC.

Это понятно, я утрировал. Но на GC мы можем повлиять только классом silin'а, или его вызовом вкупе с дебаг плеером, или намеренно нагрузив память хламом :)
Цитата:

Сообщение от AlexDesinger (Сообщение 918519)
и охота вам доверять и без того не совсем "умного" CG с слабыми ссылками, он и так чистит как ему нравиться, а вы ему еще такие важные вещи хотите доверить.
Нет, с листенерами нада все четко - в нужном месте поставили, пропала необходимость, сообщили товарищу из уборочного бюро - "приберите тут как только у вас появиться свободная минутка" и все...иначе кучи багов не избежать, все это ИМХО на личном опыте.

Вы просто не умеете его готовить (с)
Но я согласен.

Добавлено через 1 час 34 минуты
Кстати, а вот нашел в пришпиленной теме в этом разделе: http://flasher.ru/forum/showpost.php...3&postcount=40


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

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