Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 18.05.2011, 22:51
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 1  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
По умолчанию Как удалить ссылку на приемник события

Вопрос такой: При использовании следующего кода
Код AS3:
			mc.addEventListener(Event.ENTER_FRAME, function(e:Event):void {
					trace("warking");
				});
			mc.removeEventListener(Event.ENTER_FRAME, function(e:Event):void {
					trace("warking");
				});
В output все время выводится "warking". Когда использую слабую ссылку и обнуляю обьект
Код AS3:
			mc.addEventListener(Event.ENTER_FRAME, function(e:Event):void {
					trace("warking");
				}, false, 0, true);
			mc = null;
Все равно в output все время выводится "warking". Почему так? Проблема в том что сборщик мусора все еще не принялся за уничтожение? Или здесь есть нюанс немного по-серьезней?
__________________
Я мало чего умею, но зато хорошо умею учиться...

Старый 18.05.2011, 23:05
ChuwY вне форума Посмотреть профиль Отправить личное сообщение для ChuwY Посетить домашнюю страницу ChuwY Найти все сообщения от ChuwY
  № 2  
Ответить с цитированием
ChuwY
 
Аватар для ChuwY

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
Потому что ты подписываешься на один экземпляр функции, а отписываешься от другого.
Не используй замыканий (вложенных функций). Особенно для обработчиков.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.

Старый 18.05.2011, 23:11
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 3  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Я знаю что их нельзя использовать и никогда так не делаю. Это так - спортивный интерес... Хочу знать, можно ли удалить такой слушатель или нет. И почему, когда делаю так:
Код AS3:
mc.addEventListener(Event.ENTER_FRAME, function(e:Event):void {trace("warking");}, false, 0, true);
mc = null;
ничего не меняется?
__________________
Я мало чего умею, но зато хорошо умею учиться...


Последний раз редактировалось HardCoder; 18.05.2011 в 23:16.
Старый 18.05.2011, 23:53
kseniya вне форума Посмотреть профиль Отправить личное сообщение для kseniya Найти все сообщения от kseniya
  № 4  
Ответить с цитированием
kseniya
 
Аватар для kseniya

Регистрация: Oct 2010
Адрес: Новосиб
Сообщений: 122
Код AS3:
mc.addEventListener(Event.ENTER_FRAME, mcFunc, false, 0, true);
function mcFunc(e:Event):void {
	trace("warking");
}
mc.removeEventListener(Event.ENTER_FRAME,mcFunc);

Старый 19.05.2011, 00:15
ChuwY вне форума Посмотреть профиль Отправить личное сообщение для ChuwY Посетить домашнюю страницу ChuwY Найти все сообщения от ChuwY
  № 5  
Ответить с цитированием
ChuwY
 
Аватар для ChuwY

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
Кроме прочего -- ты не удалил объект из дисплейлиста.
Если не удалять -- его и GC не подберет, так как ссылка на него все еще останется в паренте.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.


Последний раз редактировалось ChuwY; 19.05.2011 в 01:08.
Старый 19.05.2011, 00:28
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 6  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Да я его даже и не добавлял...
Код AS3:
package {
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
 
	/**
	 * ...
	 * @author Tolik
	 */
	public class NewClass extends Sprite{
		private var mc:MovieClip = new MovieClip();
 
		public function NewClass(){
			mc.addEventListener(Event.ENTER_FRAME, function(e:Event):void {
					trace("warking");
				}, false, 0, true);
			mc = null;
		}
	}
}
__________________
Я мало чего умею, но зато хорошо умею учиться...


Последний раз редактировалось HardCoder; 19.05.2011 в 00:32.
Старый 19.05.2011, 00:40
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 7  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,600
Записей в блоге: 17
Внутри этой функции можно.
Вот мой сниппет, часто пишу его когда надо отписаться после первого триггера события.
Код AS3:
if (event) (event.currentTarget as IEventDispatcher).removeEventListener(event.type, arguments.callee);

Старый 19.05.2011, 00:48
derhab вне форума Посмотреть профиль Отправить личное сообщение для derhab Найти все сообщения от derhab
  № 8  
Ответить с цитированием
derhab
 
Аватар для derhab

Регистрация: Apr 2001
Адрес: Berlin
Сообщений: 1,862
Отправить сообщение для derhab с помощью ICQ Отправить сообщение для derhab с помощью Skype™
Цитата:
Сообщение от ChuwY Посмотреть сообщение
Кроме прочего -- ты не удалил объект из дисплейлиста.
Как только ты оттуда его удалишь событие энтерфрейма перестанет диспатчиться.
с чего бы это?
__________________
freelance | Раздор

Старый 19.05.2011, 01:02
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 9  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Нашел еще один вариант:
Код AS3:
mc.addEventListener(Event.ENTER_FRAME, function(e:Event):void {trace("warking");}, false, 0, true);
mc = null;
System.gc();
__________________
Я мало чего умею, но зато хорошо умею учиться...

Старый 19.05.2011, 01:07
ChuwY вне форума Посмотреть профиль Отправить личное сообщение для ChuwY Посетить домашнюю страницу ChuwY Найти все сообщения от ChuwY
  № 10  
Ответить с цитированием
ChuwY
 
Аватар для ChuwY

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
Цитата:
Сообщение от derhab Посмотреть сообщение
с чего бы это?
Моя неправда.
Но если удалить в ту же фазу, что и добавляем, то не будет диспатча.
Меня это всегда сбивает с толку.

Добавлено через 1 минуту
Цитата:
Сообщение от HardCoder Посмотреть сообщение
Нашел еще один вариант:
Код AS3:
mc.addEventListener(Event.ENTER_FRAME, function(e:Event):void {trace("warking");}, false, 0, true);
mc = null;
System.gc();
Это будет работать только в дебаге, потому не стоит на то полагаться.
К тому же экстренный запуск GC не есть хорошо.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.

Создать новую тему Ответ Часовой пояс GMT +4, время: 00:03.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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