与ARC的iOS应用程序,find谁是一个对象的所有者
我正在编写一个使用ARC的应用程序,目前似乎有一些内存泄漏。 谷歌search我发现了一些关于如何使用检查员的提示。 在那里,我可以看到一些类的实例分配的堆,我也可以看到一些调用堆栈如何分配对象,以及如何更改保留计数。
但似乎我看不到完整的调用堆栈,所以我不知道谁最终拥有这个对象。 在我看来,这个拥有者不知何故不释放该对象(或拥有该可疑对象的对象)。
任何人都可以给我一个提示find分配的对象的所有者吗?
还请注意,这些对象没有被标记为“泄漏”,而是被分配。 对我来说,好像对象被泄漏,因为分配了新的对象。
任何进一步的帮助,如何最好的继续和发现可疑的泄漏表示赞赏。
-
就谁是“拥有”一个客体这个学术问题而言,这只不过是对这个客体的
strong
引用。 -
在查找应用程序泄漏方面,您可以在分析应用程序时使用“乐器”中的“泄漏”工具(在Xcode的“产品”菜单上select“configuration文件”)。
-
但是,如果它没有出现在“泄漏”中,那么似乎需要决定它是否是一个强参考周期(以前称为保留周期),一些简单的逻辑错误(例如视图控制器中的某些循环引用,caching大型对象等)或一些核心基础相关的问题(除非您小心使用
CFBridgingRelease()
或__bridge_transfer
否则ARC不承担所有权。 -
在使用工具来查找分配的来源方面,帮助我最多的两个技巧是:
- 用鼠标点击拖拉(在6之前的Xcode版本中,您必须按住选项键)来突出显示时间线的一部分,以确定要检查的内容。 你可能想把重点放在分配的一个尖峰上。 例如,我在分配中发现了一个凹凸,并将其突出显示(这是一个非常简单的例子,我在
viewDidLoad
创build了一个巨大的数组,但希望它能给出你的想法):
- 当通过调用树进行检查时,通常select“隐藏系统库”是非常有用的,可以专注于您的代码。 如果你双击仪器中的方法名称(在我的例子中,这里是
viewDidLoad
),仪器会显示你正在执行分配的代码:
然后你可以双击相关的方法列表,它会把你精确地分配给执行分配的代码。
- 用鼠标点击拖拉(在6之前的Xcode版本中,您必须按住选项键)来突出显示时间线的一部分,以确定要检查的内容。 你可能想把重点放在分配的一个尖峰上。 例如,我在分配中发现了一个凹凸,并将其突出显示(这是一个非常简单的例子,我在
虽然这并不表明你发生了泄漏(例如,强参考周期或者你没有释放它的地方),但是这种分析通常可以帮助你追踪泄漏物体的实例化位置,这是第一个一步来追踪问题。
如果你真的必须弄清楚谁拥有一个对象(即对象的强引用(或保留)发生在哪里),Xcode 8有一个新的对象图function。 因此,debugging应用程序,然后点击debugging栏中的“debugging内存图”图标(以红色圈出,如下所示)。 一旦你这样做了,你可以在左边select一个对象,你可以看到显示对象所有权声明的对象图:
上面的例子说明了所select的图像是由UIImageView
提供的强大的引用,而且ViewController也保持了强大的引用。
在之前的Xcode版本中,通过configuration文件来运行仪器并select“logging引用计数”选项。 在Xcode 6中,它位于最右侧面板的“logging设置”选项卡中:
在Xcode 5和更早的版本中,你必须点击 信息button旁边的分配工具看到这个“logging引用计数”选项:
无论如何,你可以去分配汇总,钻入一些没有被释放的对象,(点击右箭头 当在Allocations工具中查看对象时,在对象地址旁边),然后您将看到有关对象的保留和释放列表,如上所示。 但是,只有在分析应用程序之前select“logging引用计数”, 才会捕获这些信息。
用这种方式来习惯跟踪保留计数需要一段时间,但是如果您绝对需要知道强引用的build立位置,那么“logging引用计数”选项可以帮助您。