【发布时间】:2013-10-19 17:57:14
【问题描述】:
我读了这篇关于 Flash 如何进行垃圾收集的非常好的文章: http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html
但我想知道您需要做些什么来确保所有对象都通过更快的引用计数方法而不是更占用 CPU 的标记和清除方法进行垃圾收集。假设我有以下函数并用它创建一个对象:
function makeIt():void {
var spriteA:Sprite = new Sprite();
var spriteB:Sprite = new Sprite();
spriteB.addEventListener(MouseEvent.CLICK, myCallback);
var spriteC:Sprite = new Sprite();
spriteA.addChild(spriteB);
spriteB.addChild(spriteC);
stage.addChild(spriteA);
}
如果我只是做了下面的事情,是不是只有通过mark and sweep才有资格获得GC?
spriteB.removeEventListener(MouseEvent.CLICK, myCallback);
stage.removeChild(SpriteA);
父母对他们的孩子有引用,孩子对他们的父母有引用,所以我是否必须做所有这些才能通过引用计数使其符合 GC 条件?
spriteB.removeChild(spriteC);
spriteB.removeEventListener(MouseEvent.CLICK, myCallback);
spriteA.removeChild(spriteB);
stage.removeChild(spriteA);
spriteA = null;
我是否也必须将 spriteB 和 spriteC 设置为 null ?如果 spriteC 是一个扩展 Sprite 并拥有几个自己的属性的类的实例,那会怎样。我也必须将它们设为空吗?
【问题讨论】:
-
设置为 null
spriteB和spriteC将无效。这些是局部函数变量。也不需要删除事件处理程序,因为处理程序本身不会被释放,但它也不会为调度程序创建依赖项。
标签: actionscript-3 garbage-collection reference-counting