【问题标题】:Background processes continue after removing children移除子进程后后台进程继续
【发布时间】:2016-10-27 12:56:24
【问题描述】:

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

我确实成功删除了mainMenu。但是,我在我的一个类中使用trace() 后发现一个函数仍在后台运行。 (这是mainMenu-instance 中的实例类)。

我已尝试使用以下方法消除mainMenu-instance:

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() 的谴责。所有这些孩子都应该在这一点上被淘汰,那么这些进程怎么还在运行呢?这个菜鸟需要帮助。

【问题讨论】:

  • 确保在删除菜单本身之前删除主菜单及其内部的所有事件侦听器。如果有任何活动的事件侦听器,则不会对对象进行垃圾收集。或者在添加事件监听器时使用弱引用(在 addEventListener 方法中有一个可选标志)

标签: actionscript-3 removechild


【解决方案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);

【讨论】:

  • 非常感谢!我肯定会更多地研究接口。作为一个控制狂,我发现你无法完全控制 as3 中的内存管理令人沮丧。好吧,我想我只需要学习如何绕过垃圾收集器。我一般是编程新手,我想也许我可以一起从内存中删除与特定类相关的所有数据。那么,现在我开始看到斗争的一部分。
  • @T.Alexander 即使在非托管语言中,是否显示与内存中的存在是分开的。添加到这个答案:如果它只是一个类成员,则无需将计时器设置为null,以使对象成为有资格进行垃圾收集的一部分。
  • @null 好点。将变量设置为 null 是我在处理模块化 Flex 应用程序中固定对象时养成的(可能是坏的)习惯;这里不是绝对必要的。
  • @Brian 最后一个问题,制作一个仅用于处理计时器的接口有什么好处?在这种情况下,一般的“消除”界面会不会更简单。 (如果内部类有计时器,则将它们包含在删除过程中)。我是因为没有经验才问这个的。
  • 该界面仅用于保证您将拥有stopTimers 功能可用。如果您有任何其他类似的需求,更通用的EliminationDisposable 接口肯定是有意义的。
猜你喜欢
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 2016-06-13
  • 1970-01-01
相关资源
最近更新 更多