何时使用-retainCount?

我想知道你到底在什么情况下使用了-retainCount ,最后是使用它的问题。

谢谢。

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

例如:

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

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

如果您正在尝试追查为什么某个对象没有被释放,请使用“乐器”中的“泄漏”工具。 如果您正在尝试追查为什么一个对象被释放太快,使用仪器中的僵尸工具。

但是不要使用-retainCount 。 这是一个毫无价值的方法。

编辑

请大家去http://bugreport.apple.com并请求;-retainCount被弃用。 要求的人越多越好。

编辑#2

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

决不!

认真。 只是不要这样做。

只要按照内存pipe理指南 ,只释放你所allocnewcopy (或你最初retain任何东西)。

@bbum 在这里说得最好,在他的博客上更详细。

自动释放对象是一种检查-retainCount不具有信息且可能具有误导性的情况。 保留计数并不告诉你一个对象已经调用了多less次–autorelease,因此在当前自动释放池耗尽时会释放多less次。

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

使用“分配”工具,确保“logging引用计数”处于打开状态,您可以进入任何对象并查看其retainCount历史logging。

通过配对和释放,你可以很好地了解发生的事情,并经常解决那些不被释放的困难情况。

这从来没有让我失望 – 包括在iOS的早期testing版发现错误。

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

总之,除非你已经实现了自己的引用计数系统(我几乎可以保证你不会有),否则retainCount对你来说可能是无用的。

用苹果公司自己的话来说,retainCount“在debugging内存pipe理问题上通常是没有价值的”。

你可以从使用中得到什么问题? 它所做的就是返回对象的保留计数。 我从来没有打过电话,也想不出我有任何理由。 我已经用singleton来覆盖它,以确保它们不被释放。

你不应该担心内存泄漏,直到你的应用程序启动和运行,并做一些有用的事情。

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

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

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

当然,你不应该在你的代码中使用retainCount方法,因为它的值的含义取决于已经对对象应用了多less个autoreleases,这是你无法预测的。 不过,这对于debugging非常有用 – 尤其是当您在调用主事件循环之外的Appkit对象的方法的代码中查找内存泄漏时 – 并且不应该被弃用。

在你的努力使你的观点你认真夸大了价值的不可思议的本质。 确实,这并不总是一个参考数字。 有一些特殊的值用于标志,例如表明一个对象不应该被释放。 像1152921504606846975这样的数字看起来很神秘,直到你用hex编写它,并得到0xfffffffffffffff。 9223372036854775807是hex中的0x7fffffffffffffff。 而且,有人会select使用这样的值作为标志,这实在不足为奇,因为假设你增加了每秒100,000,000次的保留数,假设要花费将近3000年的时间才能获得更高的保留数。

你不应该在你的代码中使用它,但是它在debugging时肯定会有帮助

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