移除儿童后继续后台进程

时间:2016-10-27 12:56:24

标签: actionscript-3 removechild

我制作了这个菜单,在我的程序启动时启动。 (Main.as:启动mainMenu.asmainMenu.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需要帮助。

1 个答案:

答案 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);