何时使用-retainCount?

时间:2011-01-08 21:07:15

标签: objective-c memory-management retaincount

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

感谢。

11 个答案:

答案 0 :(得分:238)

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

例如:

  • 您认为[NSNumber numberWithInt:1]的{​​{1}}为{1}。它不会。它是2。
  • 您认为retainCount的{​​{1}}为{1}。它不会。这是1152921504606846975。
  • 您认为@"Foo"的{​​{1}}为{1}。它不会。再次,它是1152921504606846975。

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

如果您正在尝试追踪对象未被解除分配的原因,请使用“乐器”中的“泄漏”工具。如果您想要过早地追踪对象被解除分配的原因,请使用仪器中的Zombies工具。

但请勿使用retainCount。这是一种真正毫无价值的方法。

修改

请所有人转到http://bugreport.apple.com并请求弃用retainCount。要求的人越多越好。

编辑#2

作为更新,retainCount现在的-retainCount为9223372036854775807.如果您的代码期望它为2,那么您的代码现已破坏。

答案 1 :(得分:51)

NEVER!

严重。只是不要这样做。

只需关注Memory Management Guidelines,即可发布您allocnewcopy(或您最初称为retain的任何内容)。

@bbum表示最好here on SO,更详细地说his blog

答案 2 :(得分:14)

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

答案 3 :(得分:10)

执行在使用“工具”进行检查时,发现retainCounts非常有用。

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

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

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

答案 4 :(得分:5)

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

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

用Apple自己的话来说,retainCount“在调试内存管理问题时通常没有价值”。

答案 5 :(得分:3)

使用它会有什么问题?它只是返回对象的保留计数。我从来没有打过电话,想不出任何理由。我已经在单身人士中覆盖了它,以确保它们不会被解除分配。

答案 6 :(得分:3)

在你的应用启动并运行并做一些有用的事情之前,你不应该担心内存泄漏。

一旦它出现,启动仪器并使用应用程序,看看是否真的发生了内存泄漏。在大多数情况下,您自己创建了一个对象(因此您拥有它)并且忘记在完成后释放它。

在编写代码时不要尝试优化代码,当您实际正常使用应用程序时,您对可能泄漏内存或花费太长时间的猜测通常是错误的。

尝试编写正确的代码,例如如果使用alloc等创建对象,请确保正确释放它。

答案 7 :(得分:3)

当然,你不应该在你的代码中使用retainCount方法,因为它的值的含义取决于已经对对象应用了多少自动释放,这是你无法预测的。但是它对于调试非常有用 - 特别是当您在代码中搜索内存泄漏时,它会调用主事件循环之外的Appkit对象的方法 - 并且不应该弃用它。

在你努力表明自己的观点时,你严重夸大了价值的难以理解的本质。确实,它并不总是引用计数。有一些特殊值用于标志,例如,表示永远不应释放对象。像1152921504606846975这样的数字看起来很神秘,直到你用十六进制写它并得到0xfffffffffffffff。并且9223372036854775807是十六进制的0x7fffffffffffffff。并且有人会选择使用这些值作为标志,这并不是很令人惊讶,因为假设你每秒增加retainCount 100,000,000次,需要将近3000年的时间才能获得一个与更大数字一样高的retainCount。

答案 8 :(得分:0)

你永远不应该在你的代码中使用它,但它在调试时肯定会有所帮助

答案 9 :(得分:0)

切勿在代码中使用-retainCount。但是,如果您使用,您将永远不会看到它返回零。想想为什么。 : - )

答案 10 :(得分:0)

Dave的帖子中使用的例子是NSNumber和NSStrings ......所以,如果你使用其他一些类,比如UIViews,我相信你会得到正确答案(保留计数取决于关于实施,它是可预测的。)