уничтожить displayObject со сцены и сборщик мусора as3?

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

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 не является нулевым. Когда я отлаживаю

объект1 = flash.display.Sprite ; и Т. Д.

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


person BigApp7e    schedule 21.06.2015    source источник


Ответы (3)


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

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

or

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

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

person am0wa    schedule 21.06.2015

Спасибо за ваш ответ, но дело в том, что в этом примере я пишу только один объект. Спрашиваю, когда у меня есть 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;
}

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

person BigApp7e    schedule 21.06.2015
comment
Большое Вам спасибо. Это мне нужно знать. С Уважением - person BigApp7e; 22.06.2015

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

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

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

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

person am0wa    schedule 21.06.2015