【问题标题】:Memory management differences between iOS device and iPhone simulatoriOS 设备和 iPhone 模拟器之间的内存管理差异
【发布时间】:2013-09-09 01:53:31
【问题描述】:

我注意到 iOS 模拟器和 iOS 设备在内存管理方面存在差异。 有时在设备上会因为尝试访问不再存在的对象而导致崩溃,而在模拟器上却没有出现(仍然没有收集对象)。

现在我有一个问题,当模拟器视图没有出现(可能被释放),而在设备上一切正常。我猜它也与内存管理有关。

在哪里可以更深入地了解设备上和模拟器上的内存管理之间的差异?以及其他设备/模拟器差异。

附:我知道类似的问题:Difference of memory organization between iOS device and iPhone simulator 但是这个问题的答案并不能理解发生了什么,只是关于内存警告的信息。

【问题讨论】:

  • 你不应该区别对待设备和模拟器——如果它在其中一个上崩溃,则意味着你的应用在两者上都有故障。
  • 不,它们不相等,应该区别对待。例如与商店套件。 -- 设备为主
  • 关键是,如果程序在一种情况下被破坏,那么在另一种情况下是什么让它工作并不重要。它仍然需要修复。

标签: ios objective-c memory-management ios-simulator


【解决方案1】:

@FreeNickname 的回答完全正确。你有一个错误,你只是碰巧在一个配置中看到它。还有一些其他的事情要记住:

  • 一个平台崩溃但另一个平台不崩溃的常见原因是未能维护线程安全。 iOS 设备有 1-2 个内核。 Mac 的功能远不止这些。在模拟器中并行运行的东西在设备上可能会变成串行或几乎串行。
  • 有时问题不在于线程,而只是常规异步。 Mac 比 iOS 设备快得多。不仅仅是因为它们有更多的内核和内存。网络连接通常也更快。磁盘访问速度更快。一切都更快。因此,如果您有竞争条件,它在两个平台上的表现可能完全不同。
  • 防止内存错误的最佳第一道防线是 ARC。强烈推荐。
  • 静态分析器是继 ARC 之后的第二道防线。确保您定期运行它并解决它发现的问题。不用说,您应该确保您的程序没有编译器警告。
  • 手动线程(NSThread/pthread)也可能导致这类问题。 GCD/NSOperation,推荐。在任何一种情况下,建议仅在单个队列上修改给定对象(通常通过让后台任务执行计算/获取/任务,然后将结果发送回主队列以存储它)。李>
  • 您的评论“(对象仍未收集)”表明可能对 ObjC 内存管理存在误解。 Cocoa 中没有垃圾收集器。对象在确定的时间被释放;一旦对象上的最后一个保留被删除,它就会立即被释放。这可能会因自动释放池而延迟,但仍具有确定性。

【讨论】:

  • 我想补充一点,Instruments 在处理内存泄漏和其他类型的错误方面也很有帮助。
【解决方案2】:

我认为您想要的不是模拟器和设备之间的区别,而是了解内存管理的工作原理。因为如果在任何地方发生错误,无论是在设备上还是在模拟器中,那么就会出现错误,您必须修复它。 本手册相当简短,但它解释了您需要了解以避免错误的所有基本规则。 iOS Memory Management Programming Guide

【讨论】:

    【解决方案3】:

    内存管理在模拟器和 IOS 上是一样的。在模拟器上你有 4GB 虚拟内存和在设备上的唯一区别 - 只有真正的 RAM。

    如果您尝试显示解除分配的视图,应用程序将同时在模拟器和设备上崩溃。

    所以主要区别在于,如果您在应用程序中发生内存泄漏,在设备上您会更早地知道这一点。

    【讨论】:

      【解决方案4】:

      以上关于内存管理的答案是正确的。但是模拟器和物理设备之间的行为差​​异很小,有时很难注意到。

      这里有几件事可能是您问题的可能答案。

      如果您尝试访问程序中的资源文件(图像、声音等),请确保您区分大小写(大写/小写字母)。模拟器会忽略大小写,但程序会在设备上崩溃。

      示例:如果您的项目中有“Image.png”文件,并且您在程序中使用“image.png”访问它,模拟器可能会加载该文件,但它肯定会在设备上崩溃。

      如果您有更高分辨率的文件,它可能会加载到设备中,但不会出现在模拟器上,反之亦然(也取决于您的计算机)。

      您还可以检查两台设备上的 Internet 连接,可能您的程序正在使用外部链接,而您的计算机未连接。

      【讨论】:

        猜你喜欢
        • 2011-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-28
        • 1970-01-01
        • 2013-10-04
        • 2012-07-24
        • 2020-01-22
        相关资源
        最近更新 更多