-1

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

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

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

PS我知道类似的问题:iOS设备和iPhone模拟器之间的内存组织差异 但是这个问题的答案并不能理解正在发生的事情,只是关于内存警告的信息。

4

4 回答 4

4

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

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

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

于 2013-09-05T09:47:32.953 回答
1

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

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

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

于 2013-09-05T09:46:42.133 回答
0

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

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

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

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

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

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

于 2017-10-26T08:04:12.273 回答