【问题标题】:iOS questions about Instruments tool, memory issue in my app关于 Instruments 工具的 iOS 问题,我的应用程序中的内存问题
【发布时间】:2012-07-16 17:35:35
【问题描述】:

我刚开始学习仪器工具,我很确定我所看到的并不好。当我查看分配,特别是“Live Bytes”和“Overall Bytes”列时,我看到随着应用程序的运行,这个数字不断增加......

我的应用有两个视图控制器。一个表视图,第二个视图控制器显示他们在表视图中选择的行的详细信息,从 Internet 下载。

我一直点击表格视图中的一行,然后点击导航栏中的后退按钮……LiveBytes 继续增加。

我猜这意味着我的对象没有从内存中释放...但如果我错了请纠正我。

我的问题是:如何使用工具/分配中的数据来追踪此内存问题?如何找到没有从内存中释放的对象?

我正在寻找有关如何使用这些工具来清理我的应用程序存在的任何内存问题的提示。

谢谢!

XCODE 4.2.1,部署到 iOS 5.0+

编辑:我正在查看#living 列,并看到像 UIScrollView 这样的对象不断增加......并且永远不会减少。当我单击导航栏中的后退按钮时,对象是否会自动从内存中释放?什么时候释放对象,还是我需要手动释放?或者我是否会因为使用强指针而遇到问题,导致对象不被释放?

【问题讨论】:

  • 听起来你在问如何追踪内存泄漏。为此,仪器中有一种称为“泄漏”的特殊工具。请注意,泄漏内存和重用对象以降低整体分配之间是有区别的。

标签: ios xcode memory-management instruments


【解决方案1】:

每当您想以循环模式观察内存使用情况时,“分配”工具中都有精彩的Heapshot 分析

  1. 启动您的应用并进入默认状态。
  2. 在 Instruments 中,按“标记堆”按钮创建“基线”。
  3. 在您的应用中执行一些操作,例如推送视图控制器。
  4. 返回默认状态。
  5. 再次按“标记堆”按钮以创建堆。
  6. 从第 3 步开始重复大约五次。

这将产生一个 heapshots 列表,每个都显示在该循环中仍然存在的对象。如果您的应用没有泄漏,则中间堆中不会留下任何对象。

前一两个周期可能已经预热了一些缓存,后两个周期可能没有清理一些重用资源。这就是为什么制作 4 到 6 个 heapshot 通常是个好主意。

heapshot 分析的神奇之处在于,heapshot 会向您显示先前循环中泄漏的对象,并在稍后释放对象时自动删除它们。与“泄漏”工具相反,它还发现废弃的内存,而不仅仅是泄漏。

【讨论】:

    【解决方案2】:

    很可能您已经放弃了 arm64 并且仅使用 armv7 运行您的应用程序。将 arm64 和 armv7 都添加为架构

    【讨论】:

      【解决方案3】:

      我认为解决内存问题的最佳方法之一是使用 ARC。

      Edit -> Refactor -> Upgrade to Objective-C ARC.
      

      ARC 将处理您应用中的大部分内存管理。特别是你的应用听起来不太复杂,它可能会完全消除你的问题。不过,您仍然需要注意保留周期并听取内存警告。如果您不想使用 ARC(您应该),至少运行静态分析器。您的问题可能很简单,静态分析器可以告诉您如何解决。

      编辑:

      您提到了滚动视图 - 这可能是您的问题:Memory leak every time UIScrollView is released

      【讨论】:

        【解决方案4】:

        配置文件工具有一个名为“泄漏”的工具。它类似于“分配”工具,但它向您显示未释放的对象。也许您可以使用“泄漏”工具来查找保留的对象是什么并释放这些对象。

        【讨论】:

          猜你喜欢
          • 2011-05-22
          • 1970-01-01
          • 1970-01-01
          • 2014-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-16
          • 1970-01-01
          相关资源
          最近更新 更多