3

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

我的应用程序有两个视图控制器。表格视图和第二个视图控制器显示有关他们在表格视图中选择的行的详细信息,这些信息是从 Internet 下载的。

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

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

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

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

谢谢!

XCODE 4.2.1,部署到 iOS 5.0+

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

4

4 回答 4

1

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

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

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

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

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

于 2012-07-17T19:09:32.670 回答
1

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

于 2017-05-23T09:23:14.430 回答
0

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

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

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

编辑:

您提到了滚动视图-这可能是您的问题:每次释放 UIScrollView 时都会发生内存泄漏

于 2012-07-17T18:43:43.903 回答
0

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

于 2012-07-17T19:08:51.080 回答