是否可以跟踪Objective-C对象的分配和释放?例如,如果我有一个类Book,我想跟踪Book类型对象的所有分配和解除分配。我可以跟踪所有默认的SKD类,例如UIViewController,UIWindow,UIView,NSDictionary等等,但我想跟踪从我定义的类创建的对象。
答案 0 :(得分:215)
您可以使用Allocations工具跟踪对象的生命周期。如果您使用“分配”模板,则会将其配置为记录malloc
和free
个事件。您可能需要将其配置为通过启用分配工具设置中的“记录引用计数”复选框来记录retain
,release
和autorelease
事件:
(您无法在乐器录制时切换此选项,只要您选择模板,它就会默认启动。)
Xcode 9的更新:Apple让查找这些设置变得更加困难。现在您需要选择Allocations工具,然后从菜单栏中选择File>录制选项。
运行后,您可以使用分配>找到您的对象。统计> “对象摘要”视图,这是“详细信息”窗格(窗口的下半部分)的默认设置:
如果要在停止运行之前查看已解除分配的对象,则需要将“分配寿命”设置更改为“已创建&仍然生活“(默认)为”创建所有对象“:
要查找特定类的对象,首先在窗口工具栏右端的“搜索”字段中键入类名。然后在列表视图的“类别”列中找到类名,将鼠标悬停在该列上,然后单击旁边显示的箭头。例如,我的应用程序有一个名为Tile
的类,因此我搜索它,然后单击列表视图中Tile
旁边的箭头:
现在,列表视图显示Tile
的每个实例。 (请注意,您必须输入对象的实际类,而不是超类。输入NSObject
将只查找由[NSObject alloc]
创建的对象,而不是[Tile alloc]
创建的对象。我可以通过单击该实例的地址旁边的箭头来查看任何特定实例的历史记录:
在对象的详细视图中,我可以看到malloc
和free
事件,因为我打开了“记录引用计数”,我还可以看到retain
, release
和autorelease
消息及其对对象保留计数的影响。如果我想查看任何这些事件的调用堆栈,我可以打开窗口右侧的扩展详细信息面板: