我正在写一个使用ARC,并且似乎有目前一些内存泄漏的应用程序。 谷歌搜索,我发现了如何使用Inspector一些提示。 在那里,我可以看到一些类的实例分配的堆,我也可以看到保留计数是怎么对象被分配,以及如何改变了一些调用堆栈。
但似乎我无法看到完整的调用堆栈,所以我不知道谁拥有最终的对象。 在我看来,这是老板有点不释放对象(或拥有该可疑对象的对象)。
任何人都可以给我一个提示上找到一个分配的对象的所有者?
另请注意,对象未标记为“泄露”,而是分配。 对我来说,好像对象泄露节节新对象分配。
如何以最佳方式进行,发现涉嫌泄露任何进一步的帮助表示赞赏。
在谁“拥有”的对象的学术问题而言,这简直是何人所保持strong
引用到该对象。
在您的应用程序寻找泄漏的条款,你可以使用,当你配置文件中的应用仪器的“泄漏”工具(选择“档案”的Xcode的“产品”菜单上)。
如果它没有显示在“泄漏”了,不过,好像你就必须决定是否有很强的参考周期(以前称为保留周期),一些简单的逻辑错误(例如,在视图控制器一些循环引用,缓存大型物体等)或某些核心基础相关的问题(ARC不承担所有权除非你小心使用CFBridgingRelease()
或__bridge_transfer
)。
在使用仪器找到分配的来源方面,两个技巧,帮助我最有:
- (前6在Xcode的版本,你必须在你这样做是为了按住Option键)点击鼠标拖动突出显示时间轴的一部分,以确定要检查什么。 你可能希望把重点放在分配的高峰之一。 例如,我发现了一个凸起在我的分配,并强调它是这样(这是在我创建一个巨大的数组一个可笑的简单的例子
viewDidLoad
,但希望它给你的想法):
- 当您通过调用树检查,但是这是可以选择“隐藏系统库”,把重点放在你的代码。 如果你在仪器方法的名称,双击(在我的例子,在这里,这将是
viewDidLoad
),仪器便会显示您的代码,在做分配:
然后,您可以双击相关的方法上市,它会带你精确到没有分配的代码。
虽然这并不表明你是泄漏发生(即,其中强周期的参考或者你没有释放),但这种分析往往可以帮助你追踪到哪里泄露的对象实例化,这是第一个步骤以跟踪问题。
如果你真的必须弄清楚谁“拥有”的对象(即该对象的强引用(或保留)发生),Xcode中8有一个新的对象图的功能。 所以调试应用程序,然后点击调试工具栏中的“调试内存图”图标(用红色圈,下同)。 一旦你这样做,你可以选择左侧的对象,就可以看到该对象图,显示在对象上的所有权主张:
以上示出了所选择的图像是具有由两个强引用UIImageView
在其出现,而且被的ViewController保持很强的参考,也。
在早期版本的Xcode,配置文件中的应用程序通过仪器来运行它,并选中“记录引用计数”选项。 在Xcode中6,这是位于“记录设置”选项卡中最右边的面板:
在Xcode 5和更早的版本,你必须点击 旁边的分配工具信息按钮,看到这个“记录引用计数”选项:
无论如何,你可以然后去分配总结,深入到这是没有公布的一些对象,(通过点击右箭头 找对象旁边的地址时,在和对象分配工具),然后你会看到列表中的保留和有问题的对象释放,如上图所示。 但是,这只有当你选择性能应用程序之前 ,“记录引用计数”将被捕获。
这需要一段时间来适应跟踪保留计数这种方式,但是如果你绝对需要知道的强引用建立,“记录引用计数”选项可以帮助你。