XCode 5 Debug Navigator Memory不同意Instruments

时间:2014-01-14 16:40:33

标签: ios memory-leaks instruments xcode5.0.1

我正在研究我的第一个ARC&核心数据项目,基于Xcode(通用)主 - 细节模板的这一阶段。 我注意到Xcode5在Debug Navigator中有一个内存显示,但在使用它时,发现它的图形与运行Leaks& Allocations跟踪时Instruments中显示的mem使用几乎没有相似之处。 我已经使用模拟器完成了仪器跟踪(模拟iPhone和iPad - 如果详细信息视图的“卸载”,后者有所不同)和iPad2&一个iPodTouch。结果大致相同:

  

iPhone 6.1模拟器

     
      
  1. A代-------- 1.13 MB
  2.   
  3. B代-------- 397.70 KB
  4.   
  5. C代-------- 76.96 KB
  6.   
  7. D代-------- 11.70 KB
  8.   
  9. E代-------- 1.56 KB
  10.   
  11. 第F代-------- 3.48 KB
  12.         

    总体增长率为30%

其中,A代表显示Master表加载的增长,而每个后续代的详细信息视图之后的增长访问进行交互(需要分别获取NSManagedObjects 创建NSObjects 。 与其他设备的增长趋势大致相似(A代增长为iPad sim:1.42; iPad2:1.57; iPodTouch:0.94但同样拖尾。)

然而,根据Debug Navigator,每个点的 用法出现在:

  

iPhone 6.1 Debug Navigator

     
      
  1. A代-------- 4.2 MB
  2.   
  3. B代-------- 6.9 MB - 增长2.7
  4.   
  5. C代-------- 7.1 MB - 增长0.2
  6.   
  7. D代-------- 7.8 MB - 增长0.7
  8.   
  9. E代-------- 8.0 MB - 增长0.2
  10.   
  11. F代-------- 8.4 MB - 增长0.4
      总体增长率为100%!
  12.   

参考其他类似的问题,我没有启用Zombies。 有其他人看到过这样的差异吗?我是否正确倾向于相信仪器而不是Debug Navigator的摘要数字?

PS。在运行真实设备时(两者都在iOS5版本上),Debug Navigator的摘要图似乎不可用。这是正常的吗?

1 个答案:

答案 0 :(得分:9)

对你来说,这可能不是一个很好的答案,但我已经完成了这项研究,这是我的理由。

调试导航器显示与“活动监视器”工具相同的内容。它没有显示您的应用程序当前分配的内存,它显示操作系统允许您的应用程序的当前内存。

假设我创建了一个for循环来在内存中创建大量对象,但后来我删除了其中一半,因为它们不符合我的搜索条件(编码错误,我知道,但假设在这里)。操作系统将从您的应用程序获取完整内存的请求以创建所有对象,但在循环后检查仪器中的分配时,它仅显示已保存的对象,因为垃圾收集取出了已删除的对象。操作系统可能会或可能不知道垃圾收集事件,但它不会占用它只是让你离开的内存。我不确定从您的应用程序提供/获取可用内存的开销,但我确信他们会考虑到这一点。我注意到,如果我将应用程序单独留下足够长的时间,操作系统会占用一些我不会使用的内存。

只需将调试内存信息视为操作系统分配的应用程序的完整内存。您可能没有使用所有这些,但操作系统无论如何都给了您(出于某种原因)。此数字将根据您应用的请求/使用情况而增加。它会因内存压力警告或不活动而降低,操作系统认为它可以安全地从您那里恢复内存。它可能永远不会与仪器分配的内存信息相匹配,因为在应用程序中总是存在瞬态内存,需要在短时间内在某处分配。

同样,这是我的结论,基于我想知道你是同样的事情。希望它有所帮助。