2010-09-09 72 views
0

我想从内存中删除简单的对象,但是当我调用removeChildren内存使用情况玫瑰:/而我不是为什么?我该如何删除对象?如何删除操作脚本3

package { 
    import flash.display.DisplayObject; 
    import flash.display.SimpleButton; 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.KeyboardEvent; 
    import flash.system.System; 

    public class Main extends Sprite { 

     public function Main() 
     { 
      for (var i:int = 0 ; i < 1000;i++) { 
       var addBouncerButton:SimpleButton = new SimpleButton(); 
       addBouncerButton.x = 100; 
       addBouncerButton.y = 10; 
       addBouncerButton.name = "Btn"+i; 
       addChild(addBouncerButton); 
      } 
      stage.addEventListener(Event.ENTER_FRAME, update); 
      stage.addEventListener(KeyboardEvent.KEY_DOWN, remove); 
     } 

     private function remove(e:KeyboardEvent):void 
     { 
      trace("Children : " + this.numChildren); 
      trace(System.totalMemory * 1024 + " kb"); 
      if(this.numChildren > 0) 
       var o:DisplayObject = removeChildAt(this.numChildren - 1); 
      o = null; 
     } 

     private function update(event:Event):void 
     { 
     } 
    } 
} 
+1

当不再有任何对该对象的引用时,对象被垃圾收集。然而,仅仅因为没有引用,这并不意味着它会立即被垃圾回收;它会在某个时候发生。 – poke 2010-09-09 21:45:14

回答

2

您可以使用delete关键字对垃圾收集对象进行排队。这个垃圾收集器可能需要一段时间(几ms)来完成它的工作,并且不应该有对你的对象的尾随引用。

为了更好地理解AS3 GC,你可以阅读这篇优秀的文章:http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html

祝你好运!

+0

恐怕你错了'删除'。 'delete'用于删除动态创建的属性,例如Object对象和字典中的条目(和键)。 – 2010-09-10 01:35:28

+0

当然@Juan是对的,我混了as2和as3。您应该确保删除对象的所有引用,并且as3gc会将其提取出来。阅读本文以更好地了解as2/3删除差异http://www.gskinner.com/blog/archives/2006/06/understanding_t.html – Johan 2010-09-10 06:14:48

0

删除对象的所有引用,例如,如果您有eventlisteners删除这些对象并将其设置为null。然后垃圾收集器会为您清理该对象,有一段时间您不需要担心它。