Actionscript 3 AS3关于删除对象和内存/垃圾回收的说明

Actionscript 3 AS3关于删除对象和内存/垃圾回收的说明,actionscript-3,memory,memory-management,memory-leaks,garbage-collection,Actionscript 3,Memory,Memory Management,Memory Leaks,Garbage Collection,我有一个例行程序,反复构建和重建一个充满按钮的大型动态电影剪辑,称为“bigList”。当它重建时,它首先尝试将bigList丢弃,这样它就不会重复地将它的实例添加到stage中(它已经做了一段时间) 我已经想出了这个代码,它似乎做到了这一点: if (bigList.stage) { trace("...bigList exists, better trash it"); bigList.parent.removeChild(bigList); bigList = null; bigList

我有一个例行程序,反复构建和重建一个充满按钮的大型动态电影剪辑,称为“bigList”。当它重建时,它首先尝试将bigList丢弃,这样它就不会重复地将它的实例添加到stage中(它已经做了一段时间)

我已经想出了这个代码,它似乎做到了这一点:

if (bigList.stage)
{
trace("...bigList exists, better trash it");
bigList.parent.removeChild(bigList);
bigList = null;
bigList = new MovieClip();
trace("...done trashing.");
}
它似乎起作用了。。。我关心的是垃圾收集和内存泄漏等等。通过上述操作,我是正确地摆脱了旧的大列表并重新替换它,还是内存中会有数据需要处理

此外,每次构建bigList时,它都会添加几十个动态生成的mc,每个mc都有一个事件监听器来检查点击。每次我扔掉bigList时,是否所有的实例和侦听器都会留下来

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


非常感谢

垃圾收集的好处在于它为您完成了大部分工作。您所要做的就是保证没有对对象的引用,如果这是真的,那么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
用法。您甚至可以删除
这个。
以简化可读性并减少混乱,但最好将其保留在其中


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

垃圾收集的好处在于它为您完成了大部分工作。您所要做的就是保证没有对对象的引用,如果这是真的,那么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
用法。您甚至可以删除
这个。
以简化可读性并减少混乱,但最好将其保留在其中


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

再加上xLite的答案,您可以在调试时使用,强制执行垃圾收集过程,并检查是否正确删除了引用—通常是在之后通过检查RAM的总使用量。

添加到xLite的答案中,您可以在调试时使用,强制执行垃圾收集过程,并检查是否正确删除了引用—通常是在调试后立即通过检查RAM的总使用量。

太好了!非常感谢您的反馈。通过这种方式破坏bigList,它会自动删除其中的所有按钮实例和事件侦听器?只要没有对它们的引用,这可以更好地解释为“只要我不能从最高点看到它们”。最高点是stage,如果GC找不到该对象的路径,那么该对象中的任何内容(前提是没有链接到stage的任何其他地方对它的引用)都将从内存中删除。事件侦听器很棘手。如果使用弱引用,它们将始终被垃圾收集。您可以通过将事件侦听器调用中的最后一个参数设置为
true
来保证这一点。示例:
addEventListener(Event.ENTER_FRAME,myCallBack,0,true)
。忽略
0
,除非您想开始学习有关事件的更高级技术。虽然这应该足够理解您正在尝试做的事情。是否有过这样的情况,我不想对动态对象上的事件侦听器使用弱引用?哦,看起来你需要在优先级和弱引用变量之前包含“capturePhase”布尔值,或者它认为你在试图强制一个值。Woops,是的,你需要
capturePhase
,你将其设置为默认值
false
,除非另有需要:
addEventListener(Event.ENTER_FRAME,myCallback,false,0,true)
。弱引用实际上只涉及在运行时使用类类型
函数创建的动态函数。您可以在中查看有关它的更多信息。如果不将其设置为弱引用,它可能会导致函数保留在内存中,即使不再使用它。否则,它只是作为良好的实践存在。太好了!谢谢反馈就到此为止。通过以这种方式破坏bigList,它会自动删除其中的所有按钮实例和事件侦听器?只要没有对它们的引用,这可以更好地解释为“只要我不能从最高点看到它们”。最高点将是阶段,如果GC找不到该对象的路径,则该对象中的任何内容(前提是没有链接到该阶段的任何其他位置对该对象的引用)都将从内存中删除。事件侦听器很棘手。如果使用弱引用,它们将始终被垃圾收集。您可以通过设置最后一个来保证这一点