【问题标题】:Can my iPad app cause the device to reboot?我的 iPad 应用程序会导致设备重启吗?
【发布时间】:2011-07-26 00:30:08
【问题描述】:

我有一个 iPad 应用程序,它有一个下载大量地图文件(几 Gig 数据和成千上万个文件)的过程。

在我最近的测试版本中,设备有时会在下载过程中重新启动(下载可能需要几个小时)。

当应用重新启动时,它不会留下崩溃报告。我们在运行 4.3.3 的 iPad 1 和 iPad 2 上都观察到了这种行为。

我能想到的唯一一件事是我们将执行这些下载的最大并发线程数从 4 个增加到 20 个。

【问题讨论】:

    标签: iphone objective-c cocoa-touch ipad


    【解决方案1】:

    完全耗尽系统内存会触发设备硬重启。这在 iPhone OS 2.0 中更为常见,在最初的 iPhone 和 iPod touch 的有限硬件上运行。在最近的操作系统版本中,Apple 更加严格地在应用程序超出其内存上限时强制执行硬杀,因此执行此操作变得更加困难。此外,这些设备的内存比以前大得多。

    您有时可以做到这一点的一种方法是加载许多大型纹理或其他图形组件,这些组件可能不会立即被识别为您的应用程序使用的内存。当以紧密的循环将一堆数据加载到 GPU 上时,我已经能够导致系统重新启动。您可能会在这里遇到类似的情况。

    我怀疑这与您使用的活动线程的数量有关,尽管它们可能使您更容易在系统杀死您的应用程序之前将大量数据转储到内存中。

    顺便说一句,您是否考虑过使用 GCD 或 ASIHTTPRequest 等基于队列的框架,而不是使用大量消耗资源的线程?这些可能对您的应用程序更有效,但仍能提供您需要的并发性。

    【讨论】:

    • 谢谢布拉德...一如既往的好答案。我们确实使用 ASIHTTP...当我们将最大并发线程数设置为 4 以上时,这个问题开始出现。它在 20 时触发很多,而在 10 时触发很少。在一个崩溃案例中,我们发现 50 个线程也在运行。跨度>
    【解决方案2】:

    您的应用崩溃的原因很可能是内存管理。由于您正在下载数 GB 的数据,也许您的磁盘空间不足?我不知道为什么您的设备需要几个小时才能重新启动。

    尝试发布一些代码。

    【讨论】:

    • 相当肯定 OP 意味着下载过程可能需要几个小时,而不是重新启动。
    • 那么应该说得更清楚;一直以来,下载数 GB 的数据可能需要几个小时才能开始。
    【解决方案3】:

    你在 Instruments 中调试过吗?这将向您显示分配是否正在增加并填充内存。如果您尝试将这些 GB 加载到内存中,那么您当然会遇到崩溃。

    另外,您是否查看了 dispatch_apply 而不是线程? GCD 根据负载自动分配和增加/减少它使用的线程。这样你就不必自己管理了。可能值得一试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-04
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多