0

我有一个例程,它反复构建和重建一个充满按钮的大型动态影片剪辑,称为“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 的所有孩子并将它们以及它们的听众也丢弃?有没有一种有效的方法来做到这一点,丢弃一个顶级对象及其所有子对象和侦听器,还是我已经用我的代码得到了它?

非常感谢!

4

2 回答 2

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.以简化可读性并减少混乱,但最好将其保留。

因此,除了那些小的建议之外,您做得很好,并且根据您的示例,您不应该有任何由该代码段引起的内存泄漏。

于 2012-05-01T21:37:04.193 回答
1

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

于 2012-05-01T22:59:24.897 回答