59

是否可以跟踪我的 Objective-C 对象的分配和释放?例如,如果我有一个 Book 类,我想跟踪 Book 类型对象的所有分配和释放。我可以跟踪所有默认的 SKD 类,例如 UIViewController、UIWindow、UIView、NSDictionary 等等,但我还想跟踪从我定义的类创建的对象。

4

1 回答 1

223

您可以使用分配工具来跟踪对象的生命周期。如果您使用“分配”模板,它被配置为记录mallocfree事件。您可能希望通过打开分配工具设置中的“记录引用计数”复选框将其配置为也记录retainrelease和事件:autorelease

记录引用计数复选框

(在 Instruments 录制时,您无法切换此选项,默认情况下,它会在您选择模板后立即启动。)

Xcode 9 更新: Apple 使查找这些设置变得更加困难。现在您需要选择 Allocations 工具,然后从菜单栏中选择 File > Recording Options。

运行后,您可以使用 Allocations > Statistics > Object Summary 视图找到您的对象,这是 Detail 窗格(窗口的下半部分)的默认设置:

详细信息窗格的对象摘要设置

如果您想查看在停止运行之前已被释放的对象,您需要将分配生命周期设置从“Created & Still Living”(默认)更改为“All Objects Created”:

分配寿命设置

要查找特定类的对象,首先在窗口工具栏右端的“搜索”字段中键入类名称。然后在列表视图的 Category 列中找到类名,将鼠标悬停在它上面,然后单击它旁边出现的箭头。例如,我的应用程序有一个名为 的类Tile,所以我搜索它,然后单击Tile列表视图中旁边的箭头:

搜索

现在列表视图显示Tile. (请注意,您必须输入对象的实际类,而不是超类。输入NSObject只会找到由 创建的[NSObject alloc]对象,而不是由 创建的对象[Tile alloc]。)我可以通过单击箭头来查看任何特定实例的历史记录下一步到该实例的地址:

获取详细信息

在对象的详细视图中,我可以看到mallocfree事件,并且由于我打开了“记录引用计数”,我还可以看到retainreleaseautorelease消息以及它们对对象保留计数的影响。如果我想查看任何这些事件的调用堆栈,我可以打开窗口右侧的扩展详细信息面板:

调用堆栈的扩展细节

于 2013-02-15T09:41:14.237 回答