Answers:
您永远不要使用-retainCount
,因为它永远不会告诉您任何有用的信息。Foundation和AppKit / UIKit框架的实现是不透明的。您不知道要保留的内容,为什么要保留它,谁要保留它,何时保留它,等等。
例如:
[NSNumber numberWithInt:1]
将有一个retainCount
1。事实并非如此。是2@"Foo"
将有一个retainCount
1。事实并非如此。是1152921504606846975。[NSString stringWithString:@"Foo"]
将有一个retainCount
1。事实并非如此。同样,它是1152921504606846975。基本上,由于任何事物都可以保留对象(并因此改变其retainCount
),并且由于您没有运行应用程序的大多数代码的源代码,因此对象的retainCount
意义不大。
如果您尝试查找为什么未释放对象的原因,请使用仪器中的“泄漏”工具。如果您试图找出为什么对象被过早释放的原因,请使用Instruments中的“僵尸”工具。
但不要使用-retainCount
。这是一种毫无价值的方法。
编辑
请所有人访问http://bugreport.apple.com并要求-retainCount
弃用。要求的人越多越好。
编辑#2
作为更新,[NSNumber numberWithInt:1]
现在retainCount
的代码为9223372036854754775807。如果您的代码期望它是2,则您的代码现在已损坏。
- (NSUInteger)retainCount{return NSUIntegerMax;}
。
retainCount
。
-retainCount
从Instruments及其工具中获得(更详细的信息)您可以获得的任何信息。
retain
,retain
,retain
,autorelease,
自动释放,autorelease
可能是传递对象通过的UIKit API,例如一个完全有效的结果。
自动发布的对象是一种情况,其中检查-retainCount不能提供信息,并且可能会引起误解。保留计数不会告诉您对一个对象调用-autorelease多少次,因此什么也不会告诉您当前自动释放池耗尽时将释放多少次。
看看关于NSObject的Apple文档,它几乎涵盖了您的问题: NSObject keepCount
简而言之,除非您已实现自己的引用计数系统(而且我几乎可以保证您不会拥有),否则retainCount对您可能毫无用处。
用苹果自己的话来说,retainCount“在调试内存管理问题中通常没有任何价值”。
当然,您永远不要在代码中使用keepCount方法,因为其值的含义取决于对对象应用了多少个自动发布,而这是您无法预测的。但是,它对于调试非常有用-尤其是当您在主事件循环外部调用Appkit对象的方法的代码中查找内存泄漏时-不应弃用它。
在表达自己的观点时,您严重夸大了价值的难以理解的本质。的确,它并不总是引用计数。有一些用于标志的特殊值,例如,指示永远不要释放对象。像1152921504606846975这样的数字看起来非常神秘,直到您用十六进制编写它并获得0xfffffffffffffff。并且9223372036854775807为十六进制的0x7fffffffffffffffff。假设您每秒增加了100,000,000次,假设某人将近300年才能获得与较大数字一样高的keepCount,那么有人选择使用诸如此类的值作为标志确实并不奇怪。
使用它会遇到什么问题?它所做的只是返回对象的保留计数。我从没打电话过,也没有想过的任何理由。我以单例方式覆盖了它,以确保它们不会被释放。
retainCount
用于内存管理的代码路径。
在您的应用程序启动并运行并执行有用的操作之前,您不必担心内存泄漏。
一旦完成,请启动Instruments并使用该应用,然后查看是否确实发生了内存泄漏。在大多数情况下,您自己创建了一个对象(因此您拥有它),并在完成后忘记释放它。
请勿在编写代码时尝试优化代码,而在正常使用该应用程序时,对于可能导致内存泄漏或时间太长的猜测常常是错误的。
请尝试编写正确的代码,例如,如果您使用alloc等创建对象,那么请确保正确释放它。
-retainCount
。