垃圾收集测试失败了吗?

时间:2011-11-04 02:29:16

标签: actionscript-3

我正在使用带弱键的Dictionary来测试对象是否已被垃圾回收。当删除对字典外部对象的所有引用时,我希望不再填充字典。它似乎适用于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 个答案:

答案 0 :(得分:1)

我会删除密钥作为最佳做法:

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

请注意,弱键表示该键符合垃圾回收条件,并在收集对象时从表中删除。垃圾收集不可能立即在你的函数中发生。

Dictionary永远不会从表中删除弱String键。

关键字和AMF序列化等方法存在一些已知问题。

您需要使用一些内存分配来触发垃圾收集。

使用你的例子,我创建了1,500个精灵,并且在4帧内移除了密钥:

输出:

  

null
  收集失败
  收集失败
  收集失败
  收集成功。

示例代码:

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();
            }
        }
    }
}