Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Создаются ли "скрытые" слушатели при MovieClip.buttonMode = true (http://www.flasher.ru/forum/showthread.php?t=175948)

HardCoder 27.02.2012 21:27

Создаются ли "скрытые" слушатели при MovieClip.buttonMode = true
 
Здравствуйте. Создаю я мувиклип с тремя кадрами: "_up", "_over" и "_down". Задаю ему buttonMode = true. Добавляю ее в спрайт-контейнер, вешаю на эту кнопку слушатель "клика". Кнопка свое отработала, удаляю слушатель "клика", удаляю ее родителя из списка отображения, и обнуляю его. Вопрос: удалится ли из памяти эта кнопка? По идее слушатель ее "клика" удален, родитель (вместе с кнопкой) со сцены удален, родитель обнулен, ссылок на кнопку больше нигде нет. Но меня настораживает, то что при задании buttonMode = true, при наведении указателя изменяется вид курсора (рука/стрелка). Это происходит автоматически, значит где-то (без моего ведома) сидят слушатели, реагирующие на Mouse.OVER/Mouse.OUT. Удалятся ли эти слушатели при обнулении родителя кнопки? Или при обнулении самой кнопки?

in4core 27.02.2012 21:29

Да, иначе об этом бы было сообщено в справке, в любом случае вы доступ к ним не имеете

HardCoder 27.02.2012 21:30

Спасибо, мне логика тоже это подсказывает, просто хотел убедится...

Wolsh 27.02.2012 21:42

Какое отношение слушатель имеет к удалению кнопки?
Вы же не ссылку на кнопку сохраняете, а наоборот "в кнопке" сохраняете ссылку на метод-хендлер и его хозяина соответственно. Эта ссылка как-то помешает удалить из памяти кнопку?

HardCoder 27.02.2012 21:50

Wolsh, спасибо за наставление. В принципе, логично. Если внутри кнопки повесить слушатель на себя, и в ней же создать обработчик. То при удалении кнопки не будет кого слушать и не будет кому обрабатывать слушатель...

Wolsh 27.02.2012 23:45

Цитата:

Если внутри кнопки повесить слушатель на себя, и в ней же создать обработчик.
Какая разница, внутри или снаружи?
Вы считаете, что когда я передаю кнопке коллбэк (хэндлер, листенер), то ссылка на кнопку приобретает бессмертие? Да нет же. Бессмертие приобретает ссылка "на меня", поскольку она сохраняется в списке слушателей кнопки, в самой кнопке. И пока жива кнопка и я не отписался от её событий, эта ссылка будет там жить. И если я решу удалить "себя", не отписавшись, у меня ничего не выйдет – поскольку существует активная ссылка "на меня". Но у меня нет никаких мистических ссылок на кнопку. Нет у меня никакого массива "кого я слушаю". Есть обычная переменная-ссылка, которой я пользовался, когда вешал слушателя на эту кнопку. Но если я ее обнулю – где у меня останется ссылка на кнопку?
При удалении объекта надо отписать этот объект от тех событий, которые он слушает. Потому что у тех, кого он слушает, есть ссылка на него. Пока на него есть ссылки, GC его не заберет.
А не наоборот.

HardCoder 28.02.2012 03:16

Wolsh, спасибо за развернутый ответ. Хочу уточнить, правильно ли я понял. Дальше речь пойдет в том плане, что лишь у "меня" есть ссылка на кнопку.

Если "я" обюнулю кнопку - слушатели ее удалятся, потому что список хендлеров(ссылка на "меня") удалится. Тогда кнопка уничтожится из памяти.

Если же НЕ удалять кнопку, а обнулить лишь себя, то ни я ни кнопка не удалятся из памяти. Потому что в кнопке будет ссылка на экземпляр "меня" (на мои обработчики). Поэтому от слушателя нужно отписаться явно; список обработчиков в кнопке удалится. Значит в кнопке не останется на меня ссылок. Я обнуляю себя. Так как я единственный, кто когда-то знал про кнопку - то кнопка тоже умирает.
Я правильно понял?

Wolsh 28.02.2012 10:46

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

alatar 28.02.2012 12:15

Цитата:

...Поэтому от слушателя нужно отписаться явно; список обработчиков в кнопке удалится.
В этом случает отписываться не обязательно.

HardCoder 28.02.2012 12:42

Цитата:

Сообщение от alatar (Сообщение 1065955)
В этом случает отписываться не обязательно.

alatar, тогда я уже ничего не понимаю :). Я так понимаю, есть два способа:
1. Обнулить кнопку (ссылка кнопки на "меня" удалится), слушатели удалятся, кнопка удалится. Потом обнулить себя. Мы с кнопкой уничтожены.
2. Отписаться от слушателя кнопки (ссылка кнопки на "меня" удалится). Потом обнулить себя. В кнопке нет ссылок на "меня", а я - единственный владелец ссылки на кнопку. Мы с кнопкой уничтожены.
Как во втором случае можно не отписываться? Использовать слабые ссылки?

alatar 28.02.2012 12:56

Wolsh уже расписал как это. Перечитайте его ответ. Он описал ситуацию когда один объект имеет ссылку на другой A -> B. GC может разрешить также ситуации когда объекты ссылаются друг на друга A -> B и B -> A. Например, объект B находится в списке отображения A и A подписался на событие объекта B (фактически дал ему ссылку на собственный метод, что равносильно ссылке на себя). В этом случае отписываться необязательно, хоть и желательно для облегчения работы GC.

HardCoder 28.02.2012 13:05

Значит, такой вариант тоже простительный:
Код AS3:

public class A {
      public var b:B;
      public function A() {
            b = new B(this);
      }
}

Код AS3:

public class B {
      public var a:A;
      public function B(link:A) {
            a = link;
      }
}

Код AS3:

var a:A = new A();
//a.b = null; - это делать не обязательно
a = null;
//GC уничтожает экземпляры A и B


alatar 28.02.2012 13:46

Уничтожит.


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

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