【问题标题】:iPhone: Instruments Allocations increasing steadilyiPhone:仪器配置稳步增长
【发布时间】:2011-03-09 19:19:14
【问题描述】:

我将 Instruments 与 Allocations 工具一起使用。我只测试与我的应用的固定交互。

我有一个导航控制器,它有 4 个阶段。前两个阶段是标准表格视图控制器,后两个阶段是具有动态加载图像的自定义控制器。

所以我在仪器中运行我的应用程序(通过使用性能工具运行 -> 分配)并执行以下交互:

1.  App Loads
2.  I wait a bit until allocations graph stabilizes
3.  I tap/push into my navigation controller until the deepest level.
4.  I wait for the images to load and for the allocations graph to stabilize.
5.  I tap back out of the navigation controller until I'm back to the root level.
6.  I wait for the allocations graph to stabilize.
7.  GOTO 3.

现在我注意到,在从 3 到 7 的每次迭代之间,分配图显示的值略高。因此,即使我在做同样的事情并且所有视图控制器的 dealloc 都被调用,总体分配也在增加。

所以时间线大致是这样的:

1.  Start: 1mb
2.  Push controllers/Load images: 4mb
3.  Pop controllers: 1.1mb
4.  Push controllers/Load images: 4.1mb
5.  Pop controllers: 1.2mb
6.  ... etc ... (always increasing slightly)

所以我的问题是这是否意味着我有泄漏或者这是正常的?此外,分配图数据实际上代表什么?为什么即使我弹回到初始状态,价值也会增加?我担心如果我的应用程序运行时间足够长,即使用户所做的只是推送和弹出视图控制器,它也会消耗太多内存。

任何想法都会有所帮助。

【问题讨论】:

    标签: iphone uinavigationcontroller memory-management instruments


    【解决方案1】:

    是的,这是泄漏。您的其中一个视图控制器缺少某些东西。

    【讨论】:

      【解决方案2】:

      您可能有泄漏。检查泄漏仪器,它可以帮助您找到它们。

      【讨论】:

      • 感谢您的建议。你是对的,使用泄漏仪器我发现我从一开始就有 3 次泄漏。我得去挖掘一下,看看到底发生了什么。
      • 如果你有一个视图控制器,你推送然后弹出,内存使用情况应该和你第一次推送之前完全一样吗?或者它上升〜.2mb是正常的吗?
      【解决方案3】:

      如果您正在加载图像,那么您很有可能正在使用 [UIImage imageNamed:],这会导致系统缓存,并且可能是您使用内存的原因。但简而言之,是的,你有泄漏。

      【讨论】:

      • 好点。虽然我所指的图像加载不使用 imageNamed 我实际上使用 imageNamed 作为我的自定义表格单元格和按钮背景图像。但我不认为这有助于整体分配的增加。由于 imageNamed 缓存图像,它不会避免在后续推送/弹出时重新加载它们吗?还是有不同的工作方式?
      • 我很确定 imageNamed 泄漏已得到修复
      【解决方案4】:

      这是在模拟器上还是在设备上?

      最好验证设备上是否存在问题,因为某些系统库在设备上释放内存的频率高于在模拟器中。

      如果 Leaks 没有显示任何内容,那是因为您仍然在某处持有对内存的引用,即使您认为自己不是。为了帮助追踪它,突出显示内存增加的图形的一小部分,然后选择“创建并仍然存在”。现在您可以只看到分配的内存,并开始追踪问题所在。

      【讨论】:

      • 在模拟器中。谢谢你的建议。事实证明我确实有泄漏,实际上是 3。我得再深入一点才能看到确切的位置。
      【解决方案5】:

      如果您拥有最新的 iPhone SDK,它附带的 Instruments 版本(我相信是 2.7)具有 HeapShot 功能。您可以观看一些 WWDC '10 视频以获取更多信息,但基本上您在第一次弹出控制器时拍摄,然后在第二次弹出时再次拍摄。它将向您显示在这两个时刻不同的任何内存分配。

      【讨论】:

      • 是的,我正在使用新的 SDK 和仪器 2.7。这听起来像是一个很酷的功能,我会定义的。看看,谢谢。
      • Heap Shot 功能听起来就像这种内存行为所需要的。我已经用它解决了类似的问题。
      猜你喜欢
      • 1970-01-01
      • 2012-11-01
      • 2011-12-04
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多