从stage和垃圾收集器as3中销毁displayObject?

时间:2015-06-21 18:02:48

标签: actionscript removechild

我需要一些非常有趣的帮助。我尝试从父母那里移除孩子或者从舞台上移除,但不仅仅是removeChild而且我想要销毁整个物体。这是一个非常简单的例子,我想做什么。

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. 
    }

//使用此代码将object1从舞台中删除但object1不为null。当我调试

object1 = flash.display.Sprite;等

我想删除子项,同时将此子项删除为null。 任何想法......

3 个答案:

答案 0 :(得分: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实例变量。

答案 1 :(得分: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;
}

子对象是动态创建的,我希望动态删除

答案 2 :(得分:0)

要清理动态创建且没有引用变量的对象,只需删除所有事件列表,使其符合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        允许你的监听器自动被垃圾收集。