2011-11-04 75 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