猿问

带有ARC的iOS应用,查找谁是对象的所有者

我正在编写一个使用ARC的应用程序,此刻似乎有一些内存泄漏。谷歌搜索我发现了一些有关如何使用检查器的提示。在这里,我可以看到一些类实例的分配堆,也可以看到一些关于如何分配对象以及如何更改保留计数的调用堆栈。

但是看来我看不到完整的调用堆栈,所以我不知道最终由谁拥有该对象。在我看来,此所有者以某种方式没有释放对象(或拥有可疑对象的对象)。

有人可以提示我寻找分配对象的所有者吗?

还请注意,对象未标记为“泄漏”,而是已分配。在我看来,随着新对象的不断分配,这些对象似乎在泄漏。

感谢您提供有关如何最好地进行和查找可疑泄漏的进一步帮助。


慕少森
浏览 712回答 1
1回答

POPMUISE

关于谁“拥有”一个对象的学术问题,这就是维护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和更早的版本中,您必须单击“分配”工具旁边的“ 信息”按钮才能看到此“记录引用计数”选项:无论如何,您都可以转到“分配摘要”,深入一些未释放的对象(通过在“分配”工具中查看和对象时单击对象地址旁边的右箭头),然后您会看到如上所示,该对象的保留和释放列表。但是,只有在对应用程序进行性能分析之前选择“记录引用计数”时,才会捕获此数据。以这种方式来跟踪保留计数需要花费一些时间,但是如果您绝对需要知道强引用的建立位置,则“记录引用计数”选项可以为您提供帮助。
随时随地看视频慕课网APP

相关分类

iOS
我要回答