2011-11-04 72 views
0

我正在使用弱密钥字典来测试对象是否被垃圾收集。当所有对字典外部的对象的引用都被删除时,我希望字典不再被填充。它似乎适用于Object,但对于Sprite它表示垃圾收集尚未发生。谁能告诉我我忽略了什么?垃圾收集测试失败?

import flash.utils.Dictionary; 

var dictionary:Dictionary=new Dictionary(true); 
this.addEventListener(Event.ENTER_FRAME,collectionTest); 
var sprite:Sprite=new Sprite(); 
dictionary[sprite]=true; 
sprite=null; 
trace(sprite);//traces null 

function collectionTest(event:Event):void{ 
    var cleared:Boolean = true; 
    for each (var key:* in dictionary) { 
     cleared = false; 
    } 
    if (cleared) { 
     trace("Collection Success."); 
    } else { 
     trace("Collection Failure"); 
    } 
} 

回答

1

我会删除键作为最佳实践:

dictionary[sprite] = null; 
delete dictionary[sprite]; 

注意,弱密钥指示键符合垃圾收集和收集对象时会被从表中删除。垃圾收集不可能立即发生在您的功能中。

词典将永远不会从表中删除弱字符串键。

有一些已知的方法作为关键和AMF序列化的问题。

您需要参与一些内存分配才能触发垃圾收集。

使用你的榜样,我创建了1500个精灵和内4帧去除键:

输出:


收集故障
收集故障
收集故障
收藏成功。

示例代码:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.utils.Dictionary; 

    public class Test extends Sprite 
    { 

     public var dictionary:Dictionary = new Dictionary(true); 

     public function Test() 
     { 
      addEventListener(Event.ENTER_FRAME, collectionTest); 
      var sprite:Sprite = new Sprite(); 
      dictionary[sprite] = true; 
      sprite = null; 
      trace(sprite); //traces null 
     } 

     protected function collectionTest(event:Event):void 
     { 
      var cleared:Boolean = true; 
      for each (var key:* in dictionary) 
      { 
       cleared = false; 
      } 
      if (cleared) 
       trace("Collection Success."); 
      else 
       trace("Collection Failure"); 

      for(var i:uint = 0; i < 500; i++) 
      { 
       new Sprite(); 
      } 
     } 
    } 
} 
+0

贾森,感谢伟大的反应! – user1028857