Actionscript 3 垃圾收集问题(显示列表和操作脚本)

Actionscript 3 垃圾收集问题(显示列表和操作脚本),actionscript-3,actionscript,Actionscript 3,Actionscript,如果我添加了一个将MovieClip或Sprite扩展到舞台的对象,并将该对象从舞台上移除,那么在以下情况下是否需要销毁方法: 没有任何事件侦听器附加到该对象 我向该对象添加了显示对象?(obj.addChild(whatever)-->当我从显示列表中删除对象时,是否需要删除“whatever”,或者这是多余的?) 任何与该对象关联的实例变量-我是否需要将它们设为null 如果删除对父对象的所有引用,则无需删除其子对象DisplayObjects,也无需清空其成员变量,前提是没有对这些子对象的

如果我添加了一个将MovieClip或Sprite扩展到舞台的对象,并将该对象从舞台上移除,那么在以下情况下是否需要销毁方法:

  • 没有任何事件侦听器附加到该对象
  • 我向该对象添加了显示对象?(obj.addChild(whatever)-->当我从显示列表中删除对象时,是否需要删除“whatever”,或者这是多余的?)
  • 任何与该对象关联的实例变量-我是否需要将它们设为null

  • 如果删除对父对象的所有引用,则无需删除其子对象DisplayObjects,也无需清空其成员变量,前提是没有对这些子对象的外部引用

    Flash使用“标记扫描”垃圾收集器。为了确定哪些对象符合垃圾收集的条件,Flash从最顶端的
    Stage
    元素开始,遍历它找到的任何引用,并在运行时标记对象。任何未标记的对象都是不可访问的,将符合垃圾收集的条件

    想象一个黑匣子对象。如果删除对此框的所有引用,则该框将有资格进行垃圾回收。现在想象一下这个黑匣子里面有很多子对象。尽管父黑盒和子对象之间可能存在引用,但这不会改变黑盒本身不可访问的事实,因此所有这些“内部”引用都无关紧要。这些对象将有资格进行垃圾收集。你已经从树上剪下了树枝,尽管树枝本身可能有许多分支和较小的分叉

    下面是一个简单的例子:

    var obj:MySprite = new MySprite();
    obj.foo = new Foo();
    obj.addChild(new Sprite());
    addChild(obj);
    
    我们如何清理obj及其子组件?所有必要的是:

    removeChild(obj);
    obj = null;
    
    现在,
    obj
    是不可访问的,它的子组件也是不可访问的。他们都有资格进行垃圾收集

    但是,如果对这些子对象有任何外部引用,则应小心:

    var obj2:Sprite = new Sprite();
    obj.addChild(obj2);
    obj = null;
    
    尽管我们清空了
    obj
    ,但我们忘记了清空
    obj2
    ,所以它不会被垃圾收集。父对象
    obj
    也不会被垃圾收集,因为
    obj2.parent
    引用它。如果
    obj
    是我们的黑盒,那么我们对
    obj2
    的引用就指向黑盒的内部

    因此,在清理对象时,可以使用空值并删除对象,特别是在不清楚的混乱情况下。如果删除它们,您将始终是安全的,但最终可能会编写不必要的代码

    如果您想了解正在发生的事情,可以使用FlashBuilder、FlashDevelop或FDT中的探查器工具查看内存使用情况。如果要测试这些想法,可以使用该调用强制GC在调试模式下运行