Показать сообщение отдельно
Старый 13.11.2013, 15:51
a7s1h1 вне форума Посмотреть профиль Отправить личное сообщение для a7s1h1 Найти все сообщения от a7s1h1
  № 9  
Ответить с цитированием
a7s1h1

Регистрация: Oct 2013
Сообщений: 126
я, возможно, не так понял, но у меня при удалении "главным родителем" всех своих детей "внуки" никуда не пропадают, толькое если их не уничтожит сам родитель. Другими словами,
Объект 1 - родитель для объекта 2
Объект 2 - родитель для объекта 3
При удалении объектом 1 всех своих детей объект 3 по-прежнему остаётся. А при повторном создании объекта 2 у него вместо одного ребёнка становится уже 2 (проверял через trace(numChildren))

Причём, я проверил, на некоторые их неудалённых детей больше никто не ссылался.

Слабые ссылки я ещё не пробовал, но теперь это уже не главная проблема.
Если я не смогу вызывать System.gc() в релизе, значит на него вообще не имеет смысла расчитывать в плане чистки в нужные мне моменты?

Я совсем запутался. Поможет ли для чистки такой подход:
В каждом классе, подлежащем помещению на сцену, писать:

Код AS3:
package {
	import flash.display.Sprite;
	import flash.events.Event;
 
	public class ClassName extends Sprite {
 
		// свойства
		child:Object; // какой-то объект-ребёнок
 
		// Контсруктор
		public function ClassName() {
			addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event):void {
			removeEventListener(Event.ADDED_TO_STAGE, init);
			addEventListener(Event.REMOVED_TO_STAGE, cleanup);
			// добавляем детей
			child = new Child();
			addChild(child);
			// добавляем слушателей детям (при необходимости)
			child.addEventListener(Event.ENTER_FRAME,childupdate)
			// добавляем слушателей себе
			addEventListener(Event.ENTER_FRAME,update)
		}
 
		private function cleanup(e:Event):void {
			// удаляем слушателей детей
			child.removeEventListener(Event.ENTER_FRAME,update)
			// удаляем детей
			while (numChildren > 0) { removeChildAt(0) };
			// удаляем своих слушателей
			removeEventListener(Event.ENTER_FRAME,update)
			removeEventListener(Event.REMOVED_TO_STAGE, cleanup);
		}
 
		private function update():void {
			//
		};
 
		private function childupdate():void {
			//
		};
	}
}