该方法retainCount
应该返回一个无符号整数。
那么,为什么[@"Hi" retainCount]
返回-1?
简单的答案是,因为@"Hi
" 是一个字符串文字,所以它将始终存在于二进制可执行映像中,并且永远不会“消失”,因此保留/释放没有任何效果,您会看到UINT_MAX
(看起来像 - 1 当打印出来时,例如用 %d 签名)。(参见 Pete Kirkham 对具有这些语义的 NSObjects 的回答)。
除此之外,知道虽然 @"Hi" 的行为类似于 是很有用的NSString*
,但它实际上是编译器创建的类实例CFConstantString
(或者可能是 NSConstantString,我的调试器不同意某些文档),它包装了文字字符串数据和给你 NSString* 接口就可以了。但是编译器知道这些字符串是特殊的并且永远不会被清理,所以它们总是会有一个 UINT_MAX (-1) 的 retainCount
根据 Apple 的NSObject 文档,它应该返回UINT_MAX
永远不会被释放的对象。如果您打印UINT_MAX
为带符号的 int,您通常会得到-1
,这可能就是您正在做的事情 - 您如何输出值?
永远不要依赖retainCount
方法。Cocoa 在幕后进行了各种优化,这使得该retainCount
方法不可靠且无用。甚至 Apple 也不鼓励使用它。坚持为 Cocoa 制定的内存管理规则,您将永远不需要知道retainCount
任何对象的内存管理规则。
有符号整数和无符号整数之间的唯一区别是您如何解释该值。如果将 -1 读取为无符号整数,您会发现它是无符号整数的最大值。
例如:NSLog(@"%u", [@"Hello" retainCount]);
它的值如此之大的原因是因为常量字符串对象永远不会被释放。
@"Hello" 不需要随代码发布,
只需注意对象是由“alloc”创建的,其他没有内存泄漏问题