我正在开发我的第一个 ARC 和核心数据项目,此阶段基于 Xcode 的(通用)主从模板。
我注意到 Xcode5 在调试导航器中显示了内存,但在使用它时发现它的图表与运行 Leaks&Allocations 跟踪时在 Instruments 中显示的内存使用情况几乎没有相似之处。
我已经使用模拟器(模拟 iPhone 和 iPad - 以防“卸载”细节视图与后者产生差异)以及在 iPad2 和 iPodTouch 上完成了乐器跟踪。结果大致相同:
iPhone 6.1模拟器
- A代--------1.13 MB
- B 代--------397.70 KB
- C 代--------76.96 KB
- D 代--------11.70 KB
- E代--------1.56 KB
- F代--------3.48 KB
整体增长约30%
其中 Generation A 显示主表加载的增长,每个连续的 Generation 显示详细信息视图加载后的增长visited and 互动过(涉及到获取 NSManagedObject和NSObject 的创建, 分别)。
其他设备的增长趋势大致相似(A 代设备的增长为 iPad sim:1.42;iPad2:1.57;iPodTouch:0.94,但同样呈下降趋势)。
然而,根据调试导航器,total每个点的使用情况如下:
iPhone 6.1 调试导航器
- A代--------4.2 MB
- B代--------6.9 MB--增长2.7
- C代--------7.1 MB--增长0.2
- D代--------7.8 MB--增长0.7
- E代--------8.0 MB--增长0.2
- F代--------8.4 MB--增长0.4
整体增长100%!
参考其他类似的问题,我没有启用僵尸。
其他人看到过这样的差异吗?我是否更倾向于相信仪器而不是调试导航器的摘要图?
附言。在运行真实设备(均在 iOS5 版本上)时,调试导航器的摘要图似乎不可用。这是正常的吗?
这对你来说可能不是一个很好的答案,但这是我通过我所做的研究来证明这个问题的理由。
调试导航器显示与“活动监视器”仪器相同的内容。它不显示您的应用程序当前分配的内存,而是显示操作系统允许您的应用程序使用的当前内存。
假设我创建了一个 for 循环来在内存中创建大量对象,但随后我删除了其中一半,因为它们不符合我的搜索条件(我知道编码很糟糕,但这里是假设的)。操作系统会从您的应用程序收到完整内存的请求来创建所有对象,但在循环之后,当您检查仪器中的分配时,它仅显示已保存的对象,因为垃圾收集删除了已删除的对象。操作系统可能知道也可能不知道垃圾收集事件,但它不会占用它刚刚释放给您的内存。我不确定从应用程序中提供/获取可用内存的开销,但我确信他们会考虑到这一点。我注意到,如果我将应用程序放置足够长的时间,操作系统就会收回一些我没有使用的内存。
只需将调试内存信息视为操作系统分配的应用程序的完整内存即可。您可能没有使用所有这些,但操作系统无论如何都会将其提供给您(出于某种原因)。此数字将根据您的应用程序的请求/使用情况而增加。由于内存压力警告或操作系统认为它可以安全地从您那里恢复内存的不活动,它会减少。它可能永远不会匹配仪器分配的内存信息,因为应用程序中总是使用瞬态内存,需要在某个地方分配,即使是很短的时间。
再说一次,这是我的结论,基于当我想知道你也有同样的事情时。希望有一点帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)