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

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

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

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
По умолчанию Необходимость удаления обработчиков событий

Такой пример, создаем мувик, ему добавляем обработку события ENTER_FRAME, по которому просто делаем trace и добавляем возможность по клику удалить этот мувик. Примерно так:
Код:
package {
	import flash.display.Sprite;
	import flash.events.*;

	dynamic public class Test extends Sprite {

		function Test():void {
			addEventListener(Event.ENTER_FRAME, doEnterFrame);
			addEventListener(MouseEvent.CLICK, doClick);
		}

		function doEnterFrame(e:Event):void {
			trace(e);
		}

		function doClick(e:Event):void {
			parent.removeChild(this);
		}
	}
}
Так вот, после клика и исчезновения мувика, продолжает вызываться doEnterFrame! Хотя событие было привязано к мувиклипу, которого уже якобы нет. На самом деле, этот мувик garbage collector не удаляет, т.к. на него осталось зарегистрировано событие.
Собственно если внимательно прочитать Help по addEventListener, там об этом четко говорится.
Цитата:
You should remove an event listener when it is no longer needed by calling EventDispatcher.removeEventListener(). Failure to remove unnecessary event listeners may have a negative impact on memory usage. Any objects with registered event listeners are not removed from memory because the garbage collector does not remove objects that still have references.
По-русски, обязательно удалять все обработчики событий (removeEventListener), когда они более не нужны, иначе объект продолжает болтаться в памяти!
Подобное положение дел, лично меня совсем не радует. Т.е. в каждом классе, который обрабатывает любые события, нужно добавлять две функции open() для инициализации обработчков событий и close() для их удаления, которую нужно вызывать перед удалением этого класса. Т.е. просто removeChild уже не достаточно. Или же в каждом классе самому следить за событием removed, по которому удалять все обработчики за собой. Примерно так:
Код:
package {
	import flash.display.Sprite;
	import flash.events.*;

	dynamic public class Test extends Sprite {

		function Test():void {
			addEventListener(Event.REMOVED, onRemoved);
			addEventListener(Event.ENTER_FRAME, doEnterFrame);
			addEventListener(MouseEvent.CLICK, doClick);
		}
		
		function onRemoved(e:Event):void {
			trace("onRemoved");
			removeEventListener(Event.REMOVED, onRemoved);
			removeEventListener(Event.ENTER_FRAME, doEnterFrame);
			removeEventListener(MouseEvent.CLICK, doClick);
		}

		function doEnterFrame(e:Event):void {
			trace(e);
		}

		function doClick(e:Event):void {
			parent.removeChild(this);
		}
	}
}
Что не совсем верно, т.к. удаление из списка отображаемых объектов еще не означает, что этот объект собираются полностью удалить. Да и сколько получается лишней писанины! Хотелось бы более простого решения, чтобы назначенные обработчики событий не препятствовали удалению объекта.
У функции addEventListener последним параметром идет
Цитата:
useWeakReference:Boolean (default = false) — Determines whether the reference to the listener is strong or weak. A strong reference (the default) prevents your listener from being garbage collected. A weak reference does not. The default value of this parameter is false.
Как я понял, именно то что надо, т.е. если вызвать
Код:
addEventListener(Event.ENTER_FRAME, doEnterFrame, false,0,true);
то объект должен удалиться даже без явного удаления этого обработчика события. Однако, это не работает
Собственно вот, подскажите где я что неправильно понял...
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

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

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

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


 


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


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