2015-06-21 3 views
0

Мне нужна помощь с чем-то очень интересным. Я пытаюсь удалить дочерний элемент из родительского или на сцену динамически, но не просто removeChild, и я хочу уничтожить весь объект. Вот очень простой пример того, что я хочу сделать.уничтожить displayObject от этапа и сборщика мусора as3?

public function TestProject() 
    { 
     holder = new Sprite(); 
     this.addChild(holder); 

     object1 = new Sprite(); 
     object1.name = "object1"; 
     object1.graphics.beginFill(0x6daeff); 
     object1.graphics.drawRect(0,0,100,100); 
     holder.addChild(object1); 

     stage.addEventListener(MouseEvent.CLICK,onClick); 
    } 

    protected function onClick(event:MouseEvent):void 
    { 
     var tmp:DisplayObject = holder.removeChild(object1); 
     tmp = null; 

     // holder.removeChild(object1) = null; this give me error. 
    } 

// с этим кодом объект1 был удален из стадии, но объект1 не является нулевым. Когда я отлаживаю

object1 = flash.display.Sprite; и т. д.

Я хочу удалить ребенка и в то же время, чтобы этот ребенок был пустым. Любые идеи ...

ответ

0

Чтобы очистить память, вы должны уничтожить все ссылки на свой объект. В этом случае:

protected function onClick(event:MouseEvent):void 
{ 
    if (holder.contains(object1)) 
     holder.removeChild(object1); 
    object1 = null; 
} 

или

protected function onClick(event:MouseEvent):void 
{ 
    if (object1.parent) 
     object1.parent.removeChild(object1); 
    object1 = null; 
} 

Примечание: Когда вы бы применять null к локальной переменной tmp вы не влияет на переменную object1 экземпляра.

0

Спасибо за ваш ответ, но точка в этом примере я пишу только один объект. Я спрашиваю, когда у меня есть 100 объектов, например. Что-то вроде этого:

for(var i:int=0;i<holder.numOfChilder;i++) 
{ 
    holder.getChildAt(i).addEventListener(Event.MouseEvent,onObjectClick) 
} 

function onObjectClick():void 
{ 
    holder.removeChild(event.currentTarget as DisplayObject) = null; 
} 

дочерний объект динамичны создан, и я хочу, динамический удален

+0

спасибо. Это мне нужно знать. С уважением – BigApp7e

0

Для объекта очистки, который был создан динамически и к которому у вас нет ссылочной переменной, просто удалить все Listers события к нему, сделать его пригодным для GC:

function onObjectClick(event:MouseEvent):void 
{ 
    var target:DisplayObject = (event.currentTarget as DisplayObject); 
    target.removeEventListener(MouseEvent.CLICK, onObjectClick); 
    holder.removeChild(target); 
} 

примечания: нет необходимости устанавливать null к вам локальным переменным потому что умрет автоматически, так как метод запуск будет завершен

Примечание2: u может установить useWeakReference=true во время добавления слушателя , чтобы ваш слушатель собирался автоматически сбрасывать мусор.

Смежные вопросы