1 回答
TA贡献1765条经验 获得超5个赞
关于谁“拥有”一个对象的学术问题,这就是维护
strong
该对象引用的人。就发现应用程序中的泄漏而言,您可以在配置应用程序时使用Instruments中的“泄漏”工具(在Xcode的“产品”菜单上选择“配置文件”)。
但是,如果它没有出现在“泄漏”中,那么您似乎必须决定它是否是一个强参考周期(以前称为保留周期),一些简单的逻辑错误(例如,视图控制器中的一些循环参考,缓存)大型对象等)或某些与Core Foundation相关的问题(除非您谨慎使用
CFBridgingRelease()
或,否则ARC不承担所有权__bridge_transfer
)。在使用乐器查找分配来源方面,最有用的两个技巧是:
用鼠标单击拖动(在6之前的Xcode版本中,option执行此操作时必须按住键)以突出显示时间轴的一部分,以标识要检查的内容。您可能想要关注分配中的峰值之一。例如,我在分配中发现了一个障碍,并如此突出显示了这(这是一个非常简单的示例,其中我在中创建了一个巨大的数组viewDidLoad,但希望它能为您提供想法):
当您按调用树进行检查时,选择“隐藏系统库”以专注于代码通常很有用。如果您双击Instruments中的方法名称(在我的示例中为viewDidLoad
),则Instruments将向您显示进行分配的代码:
然后,您可以双击相关的方法列表,它将带您精确地进行分配的代码。
当您按调用树进行检查时,选择“隐藏系统库”以专注于代码通常很有用。如果您双击Instruments中的方法名称(在我的示例中为
viewDidLoad
),则Instruments将向您显示进行分配的代码:用鼠标单击拖动(在6之前的Xcode版本中,option执行此操作时必须按住键)以突出显示时间轴的一部分,以标识要检查的内容。您可能想要关注分配中的峰值之一。例如,我在分配中发现了一个障碍,并如此突出显示了这(这是一个非常简单的示例,其中我在中创建了一个巨大的数组
viewDidLoad
,但希望它能为您提供想法):
尽管这并不表明您发生了泄漏(即强引用周期或释放失败的位置),但是这种分析通常可以帮助您跟踪泄漏对象的实例化位置,这是第一个找出问题的步骤。
如果您真的必须弄清楚谁“拥有”一个对象(即该对象的强引用(或保留位置)发生在哪里),则Xcode 8具有新的对象图功能。因此,调试应用程序,然后在调试栏中点击“调试内存图”图标(下面用红色圆圈圈出)。完成后,您可以在左侧选择一个对象,然后可以看到显示该对象所有权声明的对象图:
上面说明了所选图像在显示时都具有强引用UIImageView
,而且ViewController也维护着强引用。
在较早的Xcode版本中,对应用程序进行配置文件以通过Instruments运行它,然后选择“记录引用计数”选项。在Xcode 6中,它位于最右侧面板的“记录设置”选项卡上:
在Xcode 5和更早的版本中,您必须单击
“分配”工具旁边的“ 信息”按钮才能看到此“记录引用计数”选项:
无论如何,您都可以转到“分配摘要”,深入一些未释放的对象(通过在“分配”工具中查看和对象时单击对象地址旁边的右箭头),然后您会看到如上所示,该对象的保留和释放列表。但是,只有在对应用程序进行性能分析之前选择“记录引用计数”时,才会捕获此数据。
以这种方式来跟踪保留计数需要花费一些时间,但是如果您绝对需要知道强引用的建立位置,则“记录引用计数”选项可以为您提供帮助。
- 1 回答
- 0 关注
- 711 浏览
添加回答
举报