![]() |
Создаются ли "скрытые" слушатели при MovieClip.buttonMode = true
Здравствуйте. Создаю я мувиклип с тремя кадрами: "_up", "_over" и "_down". Задаю ему buttonMode = true. Добавляю ее в спрайт-контейнер, вешаю на эту кнопку слушатель "клика". Кнопка свое отработала, удаляю слушатель "клика", удаляю ее родителя из списка отображения, и обнуляю его. Вопрос: удалится ли из памяти эта кнопка? По идее слушатель ее "клика" удален, родитель (вместе с кнопкой) со сцены удален, родитель обнулен, ссылок на кнопку больше нигде нет. Но меня настораживает, то что при задании buttonMode = true, при наведении указателя изменяется вид курсора (рука/стрелка). Это происходит автоматически, значит где-то (без моего ведома) сидят слушатели, реагирующие на Mouse.OVER/Mouse.OUT. Удалятся ли эти слушатели при обнулении родителя кнопки? Или при обнулении самой кнопки?
|
Да, иначе об этом бы было сообщено в справке, в любом случае вы доступ к ним не имеете
|
Спасибо, мне логика тоже это подсказывает, просто хотел убедится...
|
Какое отношение слушатель имеет к удалению кнопки?
Вы же не ссылку на кнопку сохраняете, а наоборот "в кнопке" сохраняете ссылку на метод-хендлер и его хозяина соответственно. Эта ссылка как-то помешает удалить из памяти кнопку? |
Wolsh, спасибо за наставление. В принципе, логично. Если внутри кнопки повесить слушатель на себя, и в ней же создать обработчик. То при удалении кнопки не будет кого слушать и не будет кому обрабатывать слушатель...
|
Цитата:
Вы считаете, что когда я передаю кнопке коллбэк (хэндлер, листенер), то ссылка на кнопку приобретает бессмертие? Да нет же. Бессмертие приобретает ссылка "на меня", поскольку она сохраняется в списке слушателей кнопки, в самой кнопке. И пока жива кнопка и я не отписался от её событий, эта ссылка будет там жить. И если я решу удалить "себя", не отписавшись, у меня ничего не выйдет – поскольку существует активная ссылка "на меня". Но у меня нет никаких мистических ссылок на кнопку. Нет у меня никакого массива "кого я слушаю". Есть обычная переменная-ссылка, которой я пользовался, когда вешал слушателя на эту кнопку. Но если я ее обнулю – где у меня останется ссылка на кнопку? При удалении объекта надо отписать этот объект от тех событий, которые он слушает. Потому что у тех, кого он слушает, есть ссылка на него. Пока на него есть ссылки, GC его не заберет. А не наоборот. |
Wolsh, спасибо за развернутый ответ. Хочу уточнить, правильно ли я понял. Дальше речь пойдет в том плане, что лишь у "меня" есть ссылка на кнопку.
Если "я" обюнулю кнопку - слушатели ее удалятся, потому что список хендлеров(ссылка на "меня") удалится. Тогда кнопка уничтожится из памяти. Если же НЕ удалять кнопку, а обнулить лишь себя, то ни я ни кнопка не удалятся из памяти. Потому что в кнопке будет ссылка на экземпляр "меня" (на мои обработчики). Поэтому от слушателя нужно отписаться явно; список обработчиков в кнопке удалится. Значит в кнопке не останется на меня ссылок. Я обнуляю себя. Так как я единственный, кто когда-то знал про кнопку - то кнопка тоже умирает. Я правильно понял? |
Да, если "я" единственный, кто про нее знает, то есть кнопка была добавлена в "мой" список отображения, и больше ни у кого ссылок на нее нет, она умрет при обнулении "меня". Вроде это естественно.
|
Цитата:
|
Цитата:
1. Обнулить кнопку (ссылка кнопки на "меня" удалится), слушатели удалятся, кнопка удалится. Потом обнулить себя. Мы с кнопкой уничтожены. 2. Отписаться от слушателя кнопки (ссылка кнопки на "меня" удалится). Потом обнулить себя. В кнопке нет ссылок на "меня", а я - единственный владелец ссылки на кнопку. Мы с кнопкой уничтожены. Как во втором случае можно не отписываться? Использовать слабые ссылки? |
| Часовой пояс GMT +4, время: 05:59. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.