如何确定哪些对象持有对导致 Objective-c 内存泄漏的其他对象的引用?
Posted
技术标签:
【中文标题】如何确定哪些对象持有对导致 Objective-c 内存泄漏的其他对象的引用?【英文标题】:How can I determine which objects hold references to other objects that are causing memory leaks in objective-c? 【发布时间】:2012-01-08 19:06:35 【问题描述】:我尝试使用泄漏工具,并“分析”等来查找泄漏,但找不到。使用分配我可以确定没有被释放的对象。
我注意到(通过在 dealloc 方法中添加调试语句),不会为这些对象调用 dealloc。
如何确定哪些对象持有对这些对象的引用并阻止它们被释放?
【问题讨论】:
对象不“持有”引用。相反,引用计数是按方法递增的。 你是对的。我的意思是我试图确定哪些对象在使用其他对象时没有减少保留计数.. 【参考方案1】:如果您需要查看对象的保留、释放和自动释放发生的位置,请使用工具:
在仪器中运行,在分配中将“记录引用计数”设置为开启(您必须停止记录才能设置选项)。使选择器运行,停止记录,在那里搜索 ivar (datePickerView),向下钻取,您将能够看到所有保留、释放和自动释放发生的位置。
【讨论】:
好主意。我这样做了。我发现很难追踪谁在坚持它,因为有太多我不认识或直接访问的课程。最后,我只是列出了我知道直接访问我的对象的类,并一一查看。 对于任何想知道的人,“记录引用计数”选项隐藏在左侧窗格中“分配”旁边的“i”后面snag.gy/F39G0.jpg【参考方案2】:分析工具无法检测到问题。使用分配工具捕获所有引用计数是一个开始,但是有很多类我不认识或直接访问,我无法使用这种方法追踪问题。相反,我列出了我直接负责的课程,并逐行调查,直到发现问题。原因是我使用了一些第三方库,它们没有按预期减少我的一些对象的保留计数。我想在这种情况下,遵循更好的软件工程原则/设计模式,并进行彻底的代码审查可能会更早发现问题。
【讨论】:
是的,最终仔细的编码实践和彻底的代码审查是捕获大多数这些错误(以及许多其他错误)的最佳方法。 是的。我相信在使用分析工具之前应该使用您提到的方法。在分析之前仔细检查自己的代码以确保问题不存在要容易得多。【参考方案3】:我将从构建和分析项目开始(IDE 中的 Shift 命令 B)。
【讨论】:
【参考方案4】:您可以在有问题的类中重载保留/释放/自动释放实现(如果它是 SDK 类,则可以使用类别)并在那里设置断点。每次保留您的对象时,都会触发您的断点。
【讨论】:
如果仔细编码和审查 THEN 分析仍然没有给你答案,这是一个很好的解决方案。以上是关于如何确定哪些对象持有对导致 Objective-c 内存泄漏的其他对象的引用?的主要内容,如果未能解决你的问题,请参考以下文章
《Objective-C高级编程 iOS与OS X多线程和内存管理》读书笔记