7

我刚开始从事一个相对复杂的项目,并且发现了一个错误。当用户注销时,视图控制器仍然分配在登录视图控制器后面。他们继续响应旋转事件等。我已将控制器设置为nil注销时,但它仍在响应,这表明其他一些对象仍有指向它的指针。(此项目已启用 ARC。)

Pre-ARC 我可以通过覆盖来解决这个问题retain

- (id) retain
{
    // Break here to see who is retaining me.
    return [super retain];
}

如何使用 Xcode 调试工具选择一个对象并列出指向它的所有其他对象?有没有比简单地搜索所有代码更好的方法?

4

2 回答 2

6

从 Xcode 8 开始,您可以使用 Debug Memory Graph:

运行您的应用程序并查看屏幕底部的导航器。您应该看到一组三个相连的圆圈:

在此处输入图像描述

导航到任何位置,以便在内存中分配您的对象,然后点击此图标。它应该会暂停您的应用程序,并且应该会在您的 Xcode 屏幕上弹出一个图表。现在,在屏幕左侧,您可以看到对象列表。找到您想要查看所有指针的对象并单击它。现在它们应该在图表中可见。您可以通过点击分支左端节点上的两个箭头来扩展这些分支。该图应如下所示:

在此处输入图像描述

这确实为我节省了几天的工作时间。这是一个非常有用的工具。我希望它也对其他人有所帮助。

于 2016-10-31T21:27:29.530 回答
1

Instruments Heapshot Analysis 工具是我能找到的最好的工具。 本文提供了较为完整的教程,但基本步骤是:

  1. 选择产品->配置文件。选择分配工具。
  2. 在左侧,在重要事件之前/之后按下标记堆按钮。就我而言,这是在登录之前、登录之后和注销之后。
  3. 在 Heapshot 中搜索您要查找的课程。
  4. 按显示三角形查看其内存地址。
  5. 按内存地址右侧的箭头以查看其负责的调用者(它出现在最右边的列中。)

如果其他人写了更详尽的解释,或者可以提供任何相关的 lldb 命令,我很乐意将您的答案标记为正确。

于 2013-01-29T17:49:22.833 回答