XCODE 仪器 分配增长

4

分配图

我正在一个iOS应用上运行UIAutomation脚本。在大约40次迭代之后:

登录 反复点击几个按钮 然后退出

我到达了这个图表。

我的问题与分配图有关。它应该是这样的吗?我的脚本停止运行了,我认为这是因为有太多的内存泄漏?我知道泄漏发生的位置,并且总是在同一个地方。但是随着时间的推移,分配图应该是这样的吗?我会认为,在理想的内存意识应用程序中,它基本上会保持0斜率。但对我来说,这意味着随着时间的推移仍然有很多被分配的内存?

问题:图表应该是这样的吗?如果内存被正确释放(非ARC),它是否应该维护一个倾斜的分配图/随着时间的推移?

2个回答

6
不,图表不应该是这样的。除了缓存之外(即使在内存压力下清除时,它们也应该回退),分配通常应该回退。
然而,在修复泄漏之前,担心分配是没有意义的。修复泄漏可能会解决问题。修复泄漏后,重复上述练习并查看分配是否平稳。如果不是,则可能存在其他问题。但是,修复泄漏可能会完全解决问题。
此外,如果您还没有运行工具通过静态分析器(Xcode“产品”菜单上的“分析”或按shift+command+B)。特别是在MRC代码中,它将识别许多例行内存管理问题。就像魔术一样。确保在继续之前获得干净的健康状况。
然后使用泄漏工具来确定到底是什么泄漏了。然后,您可以诊断为什么该特定对象正在泄漏。在继续之前修复该泄漏。请参阅仪器用户指南查找泄漏部分。
完成所有这些操作后,您可以重复原始问题的过程,并查看分配是否继续增长(例如可能由保留周期引起的分配)。如果在修复上述已识别泄漏后仍然存在问题,则有技术可用于识别递增分配的类型,然后可以使用它们来跟踪任何进一步的问题(如果有)。
例如:
运行分配工具,option-单击并拖动分配工具,然后您可以查看调用树,它将显示正在消耗内存的内容。请参见此答案以获取示例。
运行分配工具。让应用程序稳定到静止状态。单击“标记堆”按钮。做很多事情。返回到您认为该事情应该被释放的点。再次按“标记堆”。现在查看该堆快照并查看在两个快照之间分配但未释放的对象,然后您应该能够诊断出发生了什么。
但是,在修复泄漏和泄漏工具确定泄漏对象之前,所有这些都是无意义的。首先修复它,然后看看您的情况如何。

如果想了解更多信息,您可能会发现在WWDC 2012 iOS应用程序性能:内存视频中的一些讨论很有用(特别是演示部分)。


1
请检查是否在“编辑方案:诊断”中打开了僵尸选项。僵尸永远不会被释放,如果你运行分配工具,没有任何东西被删除。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接