何时使用-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理指南 ,只释放你所alloc
, new
或copy
(或你最初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。 但是,如果你使用,你永远不会看到它返回零。 想想为什么。 🙂