何时使用-retainCount?

Mos*_*szi 110 memory-management objective-c retaincount

我想知道你-retainCount到目前为止在什么情况下使用过,最后使用它可能发生的问题.

谢谢.

Dav*_*ong 243

你永远不应该使用-retainCount它,因为它从不告诉你任何有用的东西.Foundation和AppKit/UIKit框架的实现是不透明的; 你不知道保留了什么,保留它的原因,保留它的人,保留它的时候等等.

例如:

  • 你认为它[NSNumber numberWithInt:1]会有1 retainCount个.它没有.这是2.
  • 你认为它@"Foo"会有1 retainCount个.它没有.这是1152921504606846975.
  • 你认为它[NSString stringWithString:@"Foo"]会有1 retainCount个.它没有.再次,它是1152921504606846975.

基本上,因为任何东西都可以保留一个对象(因此改变它retainCount),并且因为你没有运行应用程序的大多数代码的源代码,所以对象retainCount是没有意义的.

如果您要跟踪对象未被释放的原因,请使用"仪器"中的"泄漏"工具.如果您想要过早地找出对象被解除分配的原因,请使用Instruments中的Zombies工具.

但是不要使用-retainCount.这是一种真正毫无价值的方法.

编辑

请大家访问http://bugreport.apple.com并请求-retainCount弃用.要求的人越多越好.

编辑#2

作为更新,[NSNumber numberWithInt:1]现在有一个retainCount9223372036854775807.如果你的代码期望它是2,你的代码现在已经破了.

  • @Joe你可以制作一个单例而不会覆盖`retainCount`. (8认同)
  • @Joe我知道这件事; 谷歌"objective-c singleton"用于所有关于为什么这个例子不是很好的讨论. (5认同)
  • 谢谢@ Dave-Delong的例子. (4认同)
  • 我使用的一件事 - @ DaveDeLong,你可能也会发现这个错误,但我不这么认为 - 是覆盖deallocs和inits并将NSLogs放入其中(即使使用ARC).这让我很清楚对象是否被释放,这是我们通常试图回答的真正问题. (2认同)

Abi*_*ern 50

决不!

认真.只是不要这样做.

只需按照内存管理准则,只有释放你alloc,new或者copy(或任何你叫retain后最初).

@bbum 在SO上说得最好,在他的博客上更详细.

  • 因为你会认为你在计算记忆,但你会做错了. (7认同)
  • 除此之外,您可以从仪器及其工具中获取"-retainCount"可以获得的任何信息(更详细). (3认同)
  • 添加Dave说的话; 对象的绝对保留计数是实现细节.对象内部的细节和/或对象可能已经通过的任何其他对象的细节.例如,调用`retain`,`retain`,`retain`,`autorelease,`autorelease,`autorelease`可能是通过UIKit API传递对象的完美有效结果. (3认同)
  • 为什么?原因是什么? (2认同)
  • @ d11wtq如果retainCount永远== 0,奇点已经实现! (2认同)

Jon*_*nah 14

自动释放的对象是一种情况,其中检查-retainCount是无法提供信息并且可能具有误导性.保留计数不会告诉您在对象上调用了多少次-autorelease,因此在当前自动释放池耗尽时将释放多少次.


Egi*_*gil 10

用"仪器"检查时发现retainCounts非常有用的.

使用'分配'工具,确保打开'记录引用计数',您可以进入任何对象并查看其retainCount历史记录.

通过配置分配和释放,您可以很好地了解正在发生的事情,并经常解决那些没有发布内容的困难情况.

这从未让我失望 - 包括在iOS的早期测试版中发现错误.


lxt*_*lxt 5

看看NSObject上的Apple文档,它几乎涵盖了你的问题: NSObject retainCount

简而言之,除非你已经实现了自己的引用计数系统(并且我几乎可以保证你没有),keepCount可能对你没用.

用Apple自己的话说,retainCount"在调试内存管理问题上通常没有价值".