【问题标题】:Xcode allocations instrument generationsXcode 分配工具生成
【发布时间】:2014-02-18 13:56:46
【问题描述】:

我一直在 ARC 项目(在设备上运行)中使用 Instruments,以确保我正在清理所有废弃的内存。为此,我一直在使用分配生成工具并为相同的操作拍摄我的堆快照 10-20 次。我对增长感到困惑。有时增长为 0,而另一些时候,一些字节数(从几字节到几千字节的范围内从不一致)似乎正在累积。但通常至少有少数迭代增长为 0。

我的问题是:如果我的增长有时为 0,那是否意味着我的内存管理是正确的?还是我还有问题需要找出来?我知道内存可能需要几个周期才能“耗尽”,但是即使在 >10 次迭代之后仍然分配和剩余的内存呢?

这似乎是一个关于 Instruments 解释的更普遍的问题,所以我省略了任何具体的代码。此外,我发现这种情况发生在各种堆快照场景中:拉刷新、推送视图控制器等。

编辑:我添加了snapshot of my Instruments window

【问题讨论】:

  • 您应该寻找内存泄漏而不是分配。您可以分配一些对象,使用它,并在完成后释放它,因此有一个分配计数,但没有问题。
  • 我总是将 Memory Leaks 作为视图与 Allocations 放在一起,但从来没有出现过。但据我了解,您仍然可以有仪器无法捕获的泄漏。

标签: ios memory allocation xcode-instruments


【解决方案1】:

我想说,如果您的动作循环有多次迭代,导致分配 0 个字节并且仍然存在,那么您的内存管理很好并且没有泄漏。

您看到的增加(从几个字节到几千字节)很可能来自操作系统或后台 Apple 代码,它们试图管理您正在执行的任务。一个简单的例子是,如果您第一次调出键盘,Apple 会为其分配从未释放的内存,因此在该迭代中您将看到您没有创建的“泄漏”内存。你所做的一切都有苹果运行的背景代码,你无法定义它想用内存做什么。它可能会缓存经常执行的特定操作,以便下次运行更快。 Apple 的整个理念是流畅运行的应用程序,因此用户体验是最好的。操作系统在后台执行的操作可能是间歇性的,并可能导致内存未释放。

检查堆快照中哪些对象已分配但未释放。如果您可以将这些对象跟踪到您的代码中,然后修复它,如果您不能,那么它很可能是可以或无法避免的操作系统分配。就像我刚才说的,如果你得到很多 0 的增加,那么我不会担心,因为这些间歇性的操作系统增加。

【讨论】:

  • 感谢 Putz1103 的解释。那么这是否意味着如果我得到,说每 5 次正增长迭代 1 次 0 增长迭代,我可能会遇到问题? (即大多数堆快照都有增长)。
  • 我在 b.bum 的 cocoabuilder 中找到了这条评论:heapshot analysis to find Memory Leaks:“一般来说,您正在寻找的是任何分配为零的迭代。如果您看到一个迭代 - 一个 heapshot示例 -- 分配为零,这意味着您正在直接测试的代码(在本例中为新文档、关闭文档)不会直接导致任何永久分配。"
  • 所以听起来普遍共识(或至少基于 2 人)即使是少量的零增长迭代也意味着你在记忆方面做得很好。我很擅长。
  • 这是我在测试中了解到的。我是对还是错是一个有效的问题。
  • 明白。但我欣赏经验的洞察力。希望随着我继续开发应用程序,Instruments 的模式对我来说会变得更加明显。
猜你喜欢
  • 2012-06-09
  • 2012-08-21
  • 2011-06-05
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 2018-10-25
  • 2010-09-09
  • 1970-01-01
相关资源
最近更新 更多