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

iOS设备和iPhone模拟器之间的内存管理差异,ios,objective-c,memory-management,ios-simulator,Ios,Objective C,Memory Management,Ios Simulator,我注意到iOS模拟器和iOS设备在内存管理方面存在差异。 有时在设备上会发生崩溃,因为试图访问一个不再存在的对象,而在模拟器上它不会出现(对象仍然没有被收集) 现在我有一个问题,当模拟器上的视图没有出现时(可能会被释放),而在设备上一切正常。我猜这也和内存管理有关 从哪里可以更深入地了解设备和模拟器上内存管理的差异?以及其他设备/模拟器的差异 另外,我知道类似的问题: 但是这个问题的答案并不能解释发生了什么,只是提供了有关内存警告的信息。内存管理在模拟器和IOS上是相同的。唯一的区别是,在模拟器

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

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

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

另外,我知道类似的问题:
但是这个问题的答案并不能解释发生了什么,只是提供了有关内存警告的信息。

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

若你们尝试显示解除分配视图,应用程序将同时在Simulator和设备上崩溃


所以,最主要的区别是,如果你在应用程序和设备上有内存泄漏,你会更早地知道这一点。

我认为你想要的不是模拟器和设备之间的区别,而是对内存管理工作原理的理解。因为如果某个错误发生在任何地方,无论是在设备上还是在模拟器中,那么就有一个错误,您必须修复它。 本手册相当简短,但它解释了为避免错误而需要了解的所有基本规则。
@Free昵称的答案完全正确。您有一个bug,并且恰好在一个配置中看到它。还有几件事需要记住:

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

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

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

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

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

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


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

您不应该以不同的方式对待设备和模拟器-如果其中一台设备崩溃,则表示您的应用程序在这两台设备上都有故障。不,它们不相等,应以不同的方式对待。e、 g.带储物箱。-设备是主控设备。关键是,如果程序在一种情况下被破坏,那么在另一种情况下是什么使它工作并不重要。我想补充一点,仪器在处理内存泄漏和其他类型的错误方面也很有帮助。