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