【发布时间】:2011-10-22 18:24:14
【问题描述】:
我正在尝试找出一些错误,其中一个与内存泄漏有关。它是一个对象,我可以说某些东西仍然有引用,因为 Instruments 仍然显示它是活着的,但 Instruments 没有将它注册为泄漏。
有没有在 Objective-C 中查看一个对象的实例,看看还有哪些其他对象仍然有对该对象的引用?
【问题讨论】:
标签: objective-c memory
我正在尝试找出一些错误,其中一个与内存泄漏有关。它是一个对象,我可以说某些东西仍然有引用,因为 Instruments 仍然显示它是活着的,但 Instruments 没有将它注册为泄漏。
有没有在 Objective-C 中查看一个对象的实例,看看还有哪些其他对象仍然有对该对象的引用?
【问题讨论】:
标签: objective-c memory
如果您使用的是 xCode,则可以使用性能工具来查找内存泄漏。这将为您提供所有内存分配以及它们是否被释放或泄漏的漂亮图表。
xcode -> 运行 -> 从性能工具开始 -> 泄漏。
【讨论】:
我建议使用 Allocations/ObjectAllocations Instruments 模板,然后在右上角输入对象的类名(在 Category 字段中)。
然后,您可以看到分配量按照您的建议增加,通过查看扩展详细信息,您可以看到分配的位置。
此点以下的所有内容均由 OP (joshbuhler) 添加
在下面的截图中,将过滤器更改为“对象列表”,然后单击对象地址右侧的小箭头,将显示内存事件的历史记录(alloc/retain/release/dealloc)对于那个对象。它不会向您确切显示该对象上挂着的是什么,但它会为您提供一些非常有用的信息来追踪它。
【讨论】:
警戒尾::) 在寻找内存泄漏的过程中,我在 Xcode 中设置了一个断点(实际上是一个日志点),它会在触发 troublesome logpoint image 时记录 self 的值。与此同时,我发现了漏洞并对其进行了修补,但内存使用量并没有平衡,我的 de-init 从未被调用过。我之前设置的日志点实际上导致我的对象的保留计数增加,进而阻止了 de-init 被调用。经过几个小时的疯狂追逐后,我碰巧发现了这一点,最终我逐行遍历对象的方法,从调试控制台发出 p CFGetRetainCount(self) 。当我越过日志点的界限时,保留计数上升了。起初我认为这是我的代码的一些奇怪的副作用。我移动了那个日志点,以便可以在该行上设置一个正常的断点,我的问题随之而来。我禁用了日志点,泄漏消失了。希望这可以帮助其他人。
【讨论】: