Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 删除子项后,后台进程将继续_Actionscript 3_Removechild - Fatal编程技术网

Actionscript 3 删除子项后,后台进程将继续

Actionscript 3 删除子项后,后台进程将继续,actionscript-3,removechild,Actionscript 3,Removechild,我制作了这个菜单,在我的程序启动时启动。 (Main.as:启动mainMenu.as,mainMenu.as:启动自身内部的其他实例。)此mainMenu顶部有一个按钮,上面写着“新建游戏”,我希望此按钮将我带到下一个菜单,从而删除mainMenu-实例 我确实成功地删除了主菜单。然而,通过在我的一个类中使用trace(),我发现一个函数仍然在后台运行。(这是主菜单-instance中的实例类) 我已尝试使用以下两种方法消除主菜单-实例: this.parent.removeChild(thi

我制作了这个菜单,在我的程序启动时启动。 (
Main.as
:启动
mainMenu.as
mainMenu.as
:启动自身内部的其他实例。)此
mainMenu
顶部有一个按钮,上面写着“新建游戏”,我希望此按钮将我带到下一个菜单,从而删除
mainMenu
-实例

我确实成功地删除了
主菜单
。然而,通过在我的一个类中使用
trace()
,我发现一个函数仍然在后台运行。(这是
主菜单
-instance中的实例类)

我已尝试使用以下两种方法消除
主菜单
-实例:

this.parent.removeChild(this);
trace("all processes shall now be over");
while (this.numChildren > 0) {
    this.removeChildAt(0);
}
trace("there shall be nothing going on after this");
并且,通过使用以下命令删除
主菜单中的所有子菜单

this.parent.removeChild(this);
trace("all processes shall now be over");
while (this.numChildren > 0) {
    this.removeChildAt(0);
}
trace("there shall be nothing going on after this");

这已经从屏幕上删除了所有的视觉内容。但是
main菜单中的一个实例中的计时器循环函数仍在后台运行,再次遭到
trace()
的抨击。现在应该消除所有这些子进程,那么为什么这些进程仍在运行呢?此noobie需要帮助。

从显示列表中删除对象不会立即强制对其进行垃圾收集。您定义的任何计时器都将一直启动,直到停止或垃圾回收为止

您可以通过搜索“flex内存管理”或“actionscript 3内存管理”来阅读有关此主题的更多信息

关于您的特定菜单示例,请按如下方式更新代码:

您的菜单类和菜单类的子类都应该实现一个接口“ITimerUser”,该接口指定一个“stopTimers”函数-它将如下所示:

public function stopTimers():void {
    //If there is a timer defined
    this.myTimer.stop();
    this.myTimer = null;
}
然后将您的删除代码更改为如下所示(注意:如果混入了非计时器用户,请将
stopTimers
调用设置为可选):


在删除菜单本身之前,请确保删除主菜单上及其内部的所有事件侦听器。如果存在任何活动事件侦听器,则不会对对象进行垃圾收集。或者在添加事件侦听器时使用弱引用(addEventListener方法中有一个可选标志),非常感谢!我肯定会更多地研究接口。作为一个控制狂,我发现在as3中无法完全控制内存管理令人沮丧。嗯,我想我只需要学习如何绕过垃圾收集器。一般来说,我对编程是新手,我想也许我可以从内存中删除与特定类相关的所有数据。那么,现在我开始看到斗争的一部分。@T.Alexander即使在非托管语言中,显示与否与内存中的存在是分开的。添加到这个答案中:如果只是类成员,则无需将计时器设置为
null
,以使对象成为垃圾收集的一部分。@null很好。将变量设置为
null
是我在模块化Flex应用程序中处理固定对象时养成的一个习惯(可能是坏习惯);“这在这里不是绝对必要的。”Brian最后一个问题,制作一个仅用于处理计时器的接口有什么好处?在这种情况下,通用的“消除”接口不是更简单吗。(如果内部类具有计时器,则将其包括在删除过程中)。我问这个问题是因为缺乏经验。这个界面只是用来保证你可以使用
stopTimers
功能。如果您有任何其他类似的需求,一个更通用的
消除
一次性
界面肯定是有意义的。