0

一般的智慧是,当您从舞台上移除一个组件时,您还需要手动移除所有子级,这样它们就不会漂浮在内存中。因为自从父容器被移除后,它们就变得不可见了。

这方面的例子是 aLabel内部的一个组件BorderContainer。我的理解是您需要先删除第Label一个,然后再删除BorderContainer.

当您为它创建一个组件(例如TitleWindow默认皮肤)时,它会closeButton在标题栏/标题中添加一个。

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

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

4

2 回答 2

2

如果从舞台上移除了一个组件,只要您移除了所有事件侦听器,它的所有子组件都将自动被移除并收集垃圾。因此,您无需显式删除子项以便对它们进行垃圾收集。

但是在您的问题中,您指的是皮肤。当使用皮肤时,它们的宿主组件的skinDestructionPolicy属性总是设置为never(除了一个移动类;我忘了是哪一个)。这意味着皮肤和它的所有孩子将永远留在内存中,永远不会被垃圾收集。

现在不那么高兴的部分是:覆盖这个默认设置并不容易。阅读这个问题和我在那里写的答案,看看它是如何完成的:Spark SkinnableComponent skinDestructionPolicy

请注意,在 99% 的情况下,这种默认行为实际上不是问题。当然,我不知道你的具体情况,所以我不能进一步评论。

于 2012-06-26T21:27:18.763 回答
1

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

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

如果 TitleWindow 拥有监听器,那么由于 TitleWindow 不再在舞台上,它和它的所有子级都应该有资格进行垃圾收集。

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

于 2012-06-26T21:28:47.857 回答