如何在调试过程中检查对象的保留计数?

9

有人知道在调试模式下如何检查对象的保留计数吗?我尝试添加表达式[objInstance retainCount],但没有效果。我也在控制台中尝试了打印对象PO [objInstance retainCount],但仍然无效。


永远不要使用retainCount!如果您想检查内存泄漏,请改用xcode内存泄漏工具。 - Lunayo
1
在这里,“did not work”是什么意思? - Rob Napier
“Did not work” 意思是表达式没有给我返回计数。它显示 [objInstance retainCount] = (<unknown type>) <unknown type> - mrd3650
感谢James Webster提供的参考。 - mrd3650
我并没有用它来检测泄漏。我想追踪两个方法之间特定对象的保留计数。但是对于内存泄漏,Leaks工具很好用,我也发现Zombies非常有用。 - mrd3650
显示剩余2条评论
2个回答

8

我猜你在谈论如何在GDB中获取retainCount

你可以使用retainCount方法。

以下是我在代码中的实现方式。

(gdb) p (int)[product retainCount]
$2 = 4

希望这是你要找的内容。

是的,事实上通过(int)强制类型转换,它甚至在调试表达式中也能正常工作。谢谢! - mrd3650

6
你可以使用以下代码打印此内容:
NSLog(@"Retain count might be %d",[objInstance retainCount]);

然而,这个数字不可靠,因为像autorelease这样的原因。你应该阅读有关内存管理的资料,并确保你的retainrelease调用匹配。你也可以运行Build / Build and Analyze来让Xcode帮助你找到可能的内存泄漏,但这些仅是潜在的泄漏。你需要自己检查每一个才能确保。


2
《调用 -retainCount 被认为是有害的》(Calling -retainCount Considered Harmful)是一篇不错的阅读材料。 - user557219
如果你曾经使用过 retainCount,其值并不能保证是有意义的。 - zaph
感谢 @Bavarious 的参考,非常有启发性。我知道自动释放池,但是我很安全,因为我只有一个自动释放池,即应用程序的默认值,因此它们只会在应用程序结束时被自动释放。 - mrd3650
@mrd 不完全是这样。Cocoa 在每个事件循环的开始创建一个自动释放池,并在每个事件循环的结束时将其清空;请参阅文档。而主要问题是很难确定一个对象是否已经被自动释放,这会影响它的保留计数。 - user557219
@Bavarious 谢谢。我已经阅读了文档,但现在我对事件循环何时创建和销毁(即何时创建和排空自动释放池)感到困惑。例如,我读到这些事件发生在轻击事件上,那么当加载新视图时(例如当模态视图控制器被呈现和解除显示时),以及当视图控制器被推入/弹出导航堆栈时,是否也会发生这种情况? - mrd3650
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接