我正在研究我的第一个ARC&核心数据项目,基于Xcode(通用)主 - 细节模板的这一阶段。 我注意到Xcode5在Debug Navigator中有一个内存显示,但在使用它时,发现它的图形与运行Leaks& Allocations跟踪时Instruments中显示的mem使用几乎没有相似之处。 我已经使用模拟器完成了仪器跟踪(模拟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%
其中,A代表显示Master表加载的增长,而每个后续代的详细信息视图之后的增长访问且与进行交互(需要分别获取NSManagedObjects 和创建NSObjects 。 与其他设备的增长趋势大致相似(A代增长为iPad sim:1.42; iPad2:1.57; iPodTouch:0.94但同样拖尾。)
然而,根据Debug Navigator,每个点的 总 用法出现在:
iPhone 6.1 Debug Navigator
- 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%!
参考其他类似的问题,我没有启用Zombies。 有其他人看到过这样的差异吗?我是否正确倾向于相信仪器而不是Debug Navigator的摘要数字?
PS。在运行真实设备时(两者都在iOS5版本上),Debug Navigator的摘要图似乎不可用。这是正常的吗?
答案 0 :(得分:9)
对你来说,这可能不是一个很好的答案,但我已经完成了这项研究,这是我的理由。
调试导航器显示与“活动监视器”工具相同的内容。它没有显示您的应用程序当前分配的内存,它显示操作系统允许您的应用程序的当前内存。
假设我创建了一个for循环来在内存中创建大量对象,但后来我删除了其中一半,因为它们不符合我的搜索条件(编码错误,我知道,但假设在这里)。操作系统将从您的应用程序获取完整内存的请求以创建所有对象,但在循环后检查仪器中的分配时,它仅显示已保存的对象,因为垃圾收集取出了已删除的对象。操作系统可能会或可能不知道垃圾收集事件,但它不会占用它只是让你离开的内存。我不确定从您的应用程序提供/获取可用内存的开销,但我确信他们会考虑到这一点。我注意到,如果我将应用程序单独留下足够长的时间,操作系统会占用一些我不会使用的内存。
只需将调试内存信息视为操作系统分配的应用程序的完整内存。您可能没有使用所有这些,但操作系统无论如何都给了您(出于某种原因)。此数字将根据您应用的请求/使用情况而增加。它会因内存压力警告或不活动而降低,操作系统认为它可以安全地从您那里恢复内存。它可能永远不会与仪器分配的内存信息相匹配,因为在应用程序中总是存在瞬态内存,需要在短时间内在某处分配。
同样,这是我的结论,基于我想知道你是同样的事情。希望它有所帮助。