3

我读了这篇关于 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);
}

如果我只是做了以下,它是否只有通过标记和扫描才有资格获得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 并拥有几个自己的属性的类的实例,那会怎样。我也必须取消这些吗?

4

1 回答 1

0

是的,您必须删除Child、removeEventListener 并设置本地引用(或类级别引用)以使引用计数为零。

于 2014-01-09T15:34:54.003 回答