我正在使用带弱键的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");
}
}
答案 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();
}
}
}
}