AS3关于删除对象和内存/垃圾收集的问题

时间:2012-05-01 21:20:28

标签: actionscript-3 memory memory-management memory-leaks garbage-collection

我有一个例程,它重复构建和重建一个充满按钮的大动态movieclip,名为“bigList”。当它重建时,它首先尝试删除bigList,这样它就不会重复地将它的实例添加到舞台上(它正在做一段时间)。

我已经提出了这个似乎可以解决问题的代码:

if (bigList.stage)
{
trace("...bigList exists, better trash it");
bigList.parent.removeChild(bigList);
bigList = null;
bigList = new MovieClip();
trace("...done trashing.");
}

它似乎工作......我关心的是垃圾收集和内存泄漏等。通过以上操作,我正在摆脱旧的bigList并重新替换它,或者是否会在内存中存在我必须处理的数据?

除此之外,每次构建bigList时,它都会添加数十个动态生成的mc,每个mc都有一个事件监听器来检查点击。当我每次都丢弃bigList时,所有这些实例和听众是否仍然存在?

我是否需要遍历bigList的所有子项并将其丢弃,以及他们的侦听器?有没有一种有效的方法可以做到这一点,废弃一个顶级对象及其所有子对象和监听器,或者我已经使用我的代码得到了它?

非常感谢!

2 个答案:

答案 0 :(得分:4)

垃圾收集的好处在于它可以为您完成大部分工作。您所要做的就是保证没有对象的引用,如果这是真的,那么GC将按照自己的节奏从内存中删除对象(你不能强迫它在你自己选择的时间清空)

从上面的代码示例中,您做得很好,我建议只做一个小改动:

if (bigList.stage)
{
    trace("...bigList exists, better trash it");
    this.removeChild(bigList); // "bgList.parent" is the same as using "this"
    bigList = new MovieClip();
    trace("...done trashing.");
}

您不需要将变量设置为null,因为将新的MovieClip对象放入变量将意味着旧对象没有引用。

此外,由于您已经在父类中,因此不需要bgList.parent用法。您甚至可以删除this.以提高可读性并减少混乱,但最好将其保留。

除了这些小建议之外,你做得很好,并且根据你的示例,你不应该因为这段代码而导致任何内存泄漏。

答案 1 :(得分:1)

添加到xLite的答案,您可以在调试时使用System.gc() 来强制执行垃圾收集过程并检查您是否正在正确删除引用 - 通常通过立即检查总RAM使用情况之后通过System.totalMemoryNumber