删除元素/子元素是否也会删除作为皮肤一部分创建的组件?

时间:2012-06-26 20:32:24

标签: actionscript-3 flex

一般的智慧是,当您从舞台中删除组件时,您还需要手动删除所有子项,以便它们不会浮动在内存中。因为父元素已被删除,所以它们都不可见。

这样的示例是Label内的BorderContainer组件。我的理解是,您需要先移除Label,然后移除BorderContainer

当您创建TitleWindow等组件时,默认皮肤会为标题栏/标题添加closeButton

我在关闭按钮中添加了一个事件监听器。 TitleWindow.closeButton.addEventListener();在关闭按钮事件调用的函数中,我想关闭/删除窗口。

我的问题是这个。作为closeButton的孩子,我是否需要手动删除TitleWindow?或者我只是删除侦听器然后从舞台中删除TitleWindow并自动删除/垃圾收集皮肤创建的组件?

2 个答案:

答案 0 :(得分:2)

如果从舞台中删除某个组件,只要您删除了al事件侦听器,就会自动删除所有子组件并进行垃圾回收。因此,您不需要显式删除子项,以便对它们进行垃圾回收。

你问题中的

但是是指皮肤。使用外观时,其主机组件的skinDestructionPolicy属性始终设置为never(除了一个移动类;我忘记了哪一个)。这意味着皮肤及其所有孩子将永远留在记忆中,永远不会被垃圾收集。

现在不那么开心的部分:覆盖这个默认设置并不容易。阅读这个问题以及我在那里写的答案,看看如何做到:Spark SkinnableComponent skinDestructionPolicy

请注意,在99%的情况下,此默认行为确实不是问题。当然我不知道你的具体情况,所以我不能再对此发表评论了。

答案 1 :(得分:1)

我学到的传统智慧与你的不同。当你从舞台上删除一些东西;根据定义,它的所有孩子都不再在舞台上。假设没有对主要组件或子组件的延迟引用,它们都应该有资格进行垃圾回收。

现在,如果您将一个事件监听器添加到TitleWindow的关闭按钮;是否从舞台中删除TitleWindow将释放垃圾收集的组件取决于谁拥有监听器。

如果TitleWindow拥有侦听器,那么,由于TitleWindow不再处于舞台上,因此它和它的所有子节点都应该有资格进行垃圾收集。

如果主应用程序或仍在舞台上的任何组件持有事件侦听器,那么您必须在组件或其子组件之前删除该事件侦听器才有资格进行垃圾回收。