【问题标题】:AS3: Making objects eligible for GC by reference countingAS3:通过引用计数使对象符合 GC 条件
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2017-12-26
    • 2017-01-31
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多