删除组件是否也会删除其中的子项?

时间:2013-09-20 08:48:21

标签: actionscript-3 flex

我正在研究如何减少代码中的内存使用量,并且知道删除组件也会删除其中存在的子代。如果发生这种情况,内存使用量必须减少,但它会增加。 我有一个标题窗口,其中包含hbox,而那些hbox有画布作为包含图像的子画面。现在,如果我使用removeChild(titlewindow) 是否会删除其中存在的所有hbox,画布和图像? 如果删除,内存使用量是否减少?我怎么能在flex中做到这一点?

2 个答案:

答案 0 :(得分:1)

是的,只要您将titleWindow的值设置为null并且不再重新添加这些子项,就可以使用它删除所有内容。至于是否清除任何记忆,基本将在两个条件下:

  1. 垃圾收集器后来运行。这可能很昂贵,因此Adobe设计它不一定只是定期一次又一次地发生。相反,它往往发生在Flash Player或AIR当前堆内存不足时,此时垃圾收集器将首先检查它是否可以释放当前堆中的足够空间,然后再从操作中获取更多内容系统

  2. 您在其他地方没有任何非孤儿对这些孩子的引用。“非孤儿”,我的意思是,如果只有地方你仍然有他们参考的地方本身没有任何参考,你的计划的其余部分仍然符合。

  3. 此规则至少有一个例外,那就是垃圾收集器可以将程序中的多个对象单独列为GCRoots。期间GCRoot永远不会被垃圾收集。因此,如果你孤立一个GCRoot(使它既没有它或它的任何后代都没有在它们自己之外的任何地方引用),垃圾收集器基本上就不在乎了。 GCRoot将留在那里,因此它对任何对象的任何引用都被认为是活动的和活动的。此外,在某些情况下,垃圾收集器根本无法判断内存中的某些内容是否为引用,因此它只是假设它是并且可能无法删除某些内容。通常这不是问题,但是如果你的程序足够大并且没有进行大量的对象池,我可以从经验中告诉你,在极少数情况下特别对此做出反应是必要的。

答案 1 :(得分:0)

尝试删除后将标题窗口设置为null:

removeChild(titlewindow);
titlewindow = null;

如果主代码中没有对它们的引用,垃圾收集器将从内存中删除所有框。应该可以忽略显式删除子项,只要对它们的唯一引用来自父项,即titlewindow及其子项是一组孤立的对象。但请确保您还删除了任何可能已使用removeEventListener()注册的事件侦听器。

此外,无法保证垃圾收集器实际运行的时间,因此如果内存增加,可能只是意味着GC还没有机会清理内存。这是关于如何force GC to run的SO问题。 (调试时,System.gc()通常适用于我)。