【问题标题】:event chain or stack too long as3事件链或堆栈太长 as3
【发布时间】:2012-01-06 18:25:58
【问题描述】:

我不认为“链”在这里是正确的词。但这是我的问题:

我有 1000 个项目需要下载。

我使用带有事件的加载器:Event.COMPLETE 调用一个函数。 此函数创建一个带有事件的加载器,该事件在 Event.COMPLETE 上再次调用该函数......等等。

这从来都不是问题。我什至不知道这意味着它会全部堆积在记忆中。

在 iOS 上,这被证明是一个问题。在某个最大值,它只是告诉我我已经达到了极限。因此,在 500 处,我插入了一个 Timer,以便我可以再次从“级别 0”开始调用这些函数。

现在,我认为我的架构在这里是错误的。有什么更好的方法来实现这一点?

【问题讨论】:

  • 可以在 iOS 上使用 ActionScript 吗?这不违反他们的许可吗?
  • @Bshirely:Flash 会将 Actionscript 转换为某种本机代码。所以从技术上讲,一旦它出现在应用商店或设备上,就没有 Actionscript 可言了。

标签: ios actionscript-3 events


【解决方案1】:

您实际上是在使用递归调用来执行您的操作,这会将内存留在堆栈上。 (这通常在 C 和 C++ 等语言中涵盖较低级别。)您需要将函数重写为迭代调用,以便它们会自动从堆栈中删除 - 您可以尝试 for 循环或类似的东西。

发布您的代码 - 我将重写一个可能对您有用的替代方案。

【讨论】:

    【解决方案2】:

    首先:为什么需要下载 1000 个项目?
    您还必须同时显示这些项目吗?

    建议 1)
    也许将它们组合成一个 *.zip 文件并仅下载这个文件是一种选择... (http://ntt.cc/2008/01/19/actionscript-class-library-fzip.html)
    解压并在本地访问文件。

    建议 2)
    如果没有,也许您可​​以在完全加载文件后重用现有的Loader 实例。并将结果保存在其他地方

    建议 3)
    也许问题是,旧的Loader 实例没有从内存中删除。请记住从Loader 中删除所有事件侦听器,以便 GC 可以处理它们。

    【讨论】:

    • 关于建议 3,请注意,拥有 事件侦听器不会阻止被 GC。它是侦听器函数(addEventListener 的第二个参数)不会被 GC,而它作为注册侦听器的对象仍然可以访问。
    • 你确定吗?我认为由于对象对侦听器的引用,该对象也不会被 GC'd ...!?
    • 看看this answer,我提供了一些测试代码来演示。
    【解决方案3】:

    https://bugbase.adobe.com/index.cfm?event=bug&id=3071138 不幸的是,已经发布了好几次了。这口井可能是 Loader 的 bug。无论如何,iOS 目标非常新鲜,而且可能比其他目标更容易出错。

    然而,这不是堆栈溢出错误,因为响应加载程序的“完成”事件而调用的事件处理程序是异步的(每个都打开一个新的堆栈帧)。我不确定目前是否可以解决此问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      相关资源
      最近更新 更多