iOS设备和iPhone模拟器之间的内存管理差异

时间:2013-09-05 09:37:05

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

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

现在我有一个问题,当在模拟器视图上没有出现(可能会被解除分配),而在设备上一切都很好。我猜这也与内存管理有关。

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

P.S。我知道类似的问题:Difference of memory organization between iOS device and iPhone simulator 但是这个问题的答案并不能理解正在发生的事情,只是关于记忆警告的信息。

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

如果您尝试显示取消分配的视图,应用程序将会同时扫描模拟器和设备。

所以主要区别在于,如果您在应用程序中有内存泄漏,那么您可以在设备上获得更早的信息。

答案 3 :(得分:0)

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

以下几点可能是您问题的可能答案。

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

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

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

您还可以检查两台设备上的互联网连接,也许您的程序正在使用外部链接,而您的计算机尚未连接。