我制作了这个菜单,在我的程序启动时启动。
(Main.as
:启动mainMenu.as
,mainMenu.as
:在其内部启动其他实例。)此mainMenu
顶部有一个按钮,表示"新游戏",我希望此按钮将我带到下一个菜单,从而删除mainMenu
- 实例。
我成功删除了mainMenu
。但是,我在我的一个类中使用trace()
表示一个函数仍然在后台运行,这让我很震惊。 (这是mainMenu
- 实例)中的实例类。
我已尝试使用以下方法消除mainMenu
- 实例:
this.parent.removeChild(this);
trace("all processes shall now be over");
并删除mainMenu
中的所有子项:
while (this.numChildren > 0) {
this.removeChildAt(0);
}
trace("there shall be nothing going on after this");
这已从屏幕中删除了所有可视内容。但是来自mainMenu
内部其中一个实例的计时器循环函数仍在后台运行,再次被trace()
唾弃。此时所有这些孩子都应该被淘汰,那么为什么这些过程仍在运行?这个noobie需要帮助。
答案 0 :(得分:1)
从显示列表中删除对象不会立即强制它被垃圾收集。您定义的任何计时器将继续开火,直到它们被停止或被垃圾收集。
您可以通过搜索“flex memory management”或“actionscript 3 memory management”来阅读有关此主题的更多信息。
关于您的特定菜单示例,请按以下步骤更新您的代码:
菜单类和菜单类的子项都应该实现一个“ITimerUser”接口,它指定一个“stopTimers”函数 - 它看起来像这样:
public function stopTimers():void {
//If there is a timer defined
this.myTimer.stop();
this.myTimer = null;
}
然后将您的删除代码更改为如下所示(例如,如果您将非计时器用户混入,请stopTimers
调用可选):
while (this.numChildren > 0) {
var child = (ITimerUser) this.getChildAt(0);
if (child) {
child.stopTimers();
}
this.removeChildAt(0);
}
this.stopTimers();
this.parent.removeChild(this);