Показать сообщение отдельно
Старый 28.08.2011, 19:03
Genm вне форума Посмотреть профиль Отправить личное сообщение для Genm Найти все сообщения от Genm
  № 1  
Ответить с цитированием
Genm

Регистрация: Aug 2011
Сообщений: 24
Записей в блоге: 1
Cool Автоматическое удаление всех потомков и прослушивателей

Всем привет,

Давайте представим такую ситуацию, что Вы создали страничку. На ней много картинок, кнопок с прослушивателями, пользовательский курсор да еще и прицепленный к stage ENTER_FRAME. Вы ее посмотрели и захотели закрыть. Сделав так: page = null, у нас в итоге все прослушиватели остануться висеть в памяти. Тогда что удалять каждый прослушиватель ручками? Нет это не наш путь, нам ведь так лениво!

Вместо кропотливой писанины по удалению прослушивателей давайте лучше будем наследовать все классы где установлены прослушиватели от класса Basic. Тогда используя addEL можно устанавливать прослушиватели и заодно их регистрировать. А для очистки страницы используем метод free(page).

Хотел добавить эту запись в блог, чтобы тема не потерялась, но видно не судьба...

Код AS3:
package {
	import flash.display.*
	import flash.events.*
	import flash.utils.*
 
public class Basic extends Sprite {
	//Массив установленных прослушивателей
	public var myArrayListeners:Array = [];
/**
 * Ставим прослушиватель и метку
 * @param	conteiner
 * @param	type
 * @param	listener
 * @param	useCapture
 * @param	priority
 * @param	useWeakReference
 * @param	onStage
 */
public function addEL(conteiner:Object,type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void {
	//Добавляем слушатель только, если такого слушателя еще нет
	var instance:Object
	var aLengh:uint = myArrayListeners.length
	for (var i:uint = 0; i < aLengh; i++ ) {
		instance = myArrayListeners[i]
		//Находим элемент из массива
		if (instance.type == type && instance.listener == listener && instance.conteiner == conteiner) {
			//throw new Error("Такой прослушиватель уже есть");
			return
		}
	}
	//Добавляем прослушиватель после проверки
	conteiner.addEventListener (type, listener, useCapture, priority, useWeakReference);
	//Добавляем в массив метку
	myArrayListeners.push( { type:type, listener:listener, conteiner:conteiner } );
}
/**
 * Удаляем прослушиватель и убираем метку
 * @param	conteiner
 * @param	type
 * @param	listener
 * @param	useCapture
 * @param	onStage
 */
public function removeEL(conteiner:Object,type:String, listener:Function, useCapture:Boolean = true):void {
	//Находим в массиве флаг слушатель которого удалили
	var instance:Object
	var aLengh:uint = myArrayListeners.length
	for (var i:uint = 0; i < aLengh; i++ ) {
		instance = myArrayListeners[i]
		//Находим и удаляем элемент из массива
		if (instance.type == type && instance.listener == listener && instance.conteiner == conteiner) {
			conteiner.removeEventListener (type, listener, useCapture);
			myArrayListeners.splice(i, 1)
			return
		}
	}
}
/**
 * Очистка контейнеров от данных
 * @param	conteiner
 * @param	clearAll
 */
public function free(conteiner:Object, clearAll:Boolean = false):void {
	if(conteiner!=null){
		//Определяем класс полученного контейнера
		var myClass:Class = getDefinitionByName(getQualifiedClassName(conteiner)) as Class;
		//Обрабатываем объект
		var cLength:uint = 0
		if (myClass == Array) {
			//Размер массива
			cLength = conteiner.length
			//Очищаем массив от объектов
			while (--cLength > -1) {
				//Ощищаем и объекты входящие в данный объект
				free(conteiner[cLength])
				//Удаляем компоненты
				conteiner.splice(cLength, 1);
			}
		}
		cLength = 0
		if (myClass == Object) {
			//Очищаем контейнер от объектов
			for (var item1:String in conteiner) {
				//Ощищаем и объекты входящие в данный объект
				free(conteiner[item1])
				//Удаляем объект
				delete conteiner[item1]
			}
		}
		//Создаем локальную переменную
		var localArrayListeners:Array
		//Проверяем массив прослушивателей
		var checkListeners:Boolean = conteiner.hasOwnProperty("myArrayListeners")
		//Если есть, то работаем с ней
		if (checkListeners) {
			localArrayListeners = conteiner.myArrayListeners
		}else {
			localArrayListeners = myArrayListeners
		}
		//Проверяем есть ли потомки
		var checkСhildrens:Boolean = conteiner.hasOwnProperty("numChildren")
		//Обрабатываем спрайты
		if (checkСhildrens) {
			//Очищаем контейнер от прослушивателей
			var instance:Object
			//Создаем локальные переменные
			var localConteiner:Object
			//Проходим по всем сохраненным прослушивателям
			for (var j:uint = 0; j < localArrayListeners.length; j++ ) {
				//Передаем объект по ссылке
				instance = localArrayListeners[j]
				localConteiner = conteiner
				//Проверяем имена дочерних элементов и удаляем у них прослушиватели
				if (localConteiner.hasEventListener(instance.type) == true) {
					//Проверяем класс, чтобы не перебирать лишние элементы
					if (instance.conteiner == localConteiner) {
						//Удаляем прослушиватель
						localConteiner.removeEventListener(instance.type, instance.listener,false)
						localConteiner.removeEventListener(instance.type, instance.listener, true)
						//Если прослушиватель удален, то удаляем метку из массива прослушивателей
						if (localConteiner.hasEventListener(instance.type) == false) {
							localArrayListeners.splice(j, 1)
							//Так как размер массива изменился и данные сместились,то смещаем и счетчик
							j--
						}
					}
				}
			}
			//Очищаем контейнер от объектов
			//Колличество дочерних элементов
			if (conteiner.numChildren != null) {
				cLength = conteiner.numChildren
				if (cLength != 0) {
					for (var i:uint = 0; i < cLength; i++) {
						//Ощищаем и объекты входящие в данный объект
						free(conteiner.getChildAt(0))
						//Удаляем объект
						conteiner.removeChildAt(0)
 
					}
				}
			}
			//Удаляем сам контейнер
			if(clearAll == true){
				conteiner.parent.removeChild(conteiner)	
				conteiner = null
			}
		}else {
			//Очищаем картинку от данных
			var checkData:Boolean = conteiner.hasOwnProperty("bitmapData")
			//Если есть, то работаем с ней
			if (checkData) {
				conteiner.bitmapData.dispose()
			}
		}
	}
}
 
}}