2

该方法retainCount应该返回一个无符号整数。

那么,为什么[@"Hi" retainCount]返回-1?

4

5 回答 5

10

简单的答案是,因为@"Hi" 是一个字符串文字,所以它将始终存在于二进制可执行映像中,并且永远不会“消失”,因此保留/释放没有任何效果,您会看到UINT_MAX(看起来像 - 1 当打印出来时,例如用 %d 签名)。(参见 Pete Kirkham 对具有这些语义的 NSObjects 的回答)。

除此之外,知道虽然 @"Hi" 的行为类似于 是很有用的NSString*,但它实际上是编译器创建的类实例CFConstantString(或者可能是 NSConstantString,我的调试器不同意某些文档),它包装了文字字符串数据和给你 NSString* 接口就可以了。但是编译器知道这些字符串是特殊的并且永远不会被清理,所以它们总是会有一个 UINT_MAX (-1) 的 retainCount

于 2010-01-06T17:16:23.733 回答
6

根据 Apple 的NSObject 文档,它应该返回UINT_MAX永远不会被释放的对象。如果您打印UINT_MAX为带符号的 int,您通常会得到-1,这可能就是您正在做的事情 - 您如何输出值?

于 2010-01-06T17:10:38.510 回答
3

永远不要依赖retainCount方法。Cocoa 在幕后进行了各种优化,这使得该retainCount方法不可靠且无用。甚至 Apple 也不鼓励使用它。坚持为 Cocoa 制定的内存管理规则,您将永远不需要知道retainCount任何对象的内存管理规则。

于 2010-01-06T20:19:17.967 回答
0

有符号整数和无符号整数之间的唯一区别是您如何解释该值。如果将 -1 读取为无符号整数,您会发现它是无符号整数的最大值。

例如:NSLog(@"%u", [@"Hello" retainCount]);

它的值如此之大的原因是因为常量字符串对象永远不会被释放。

于 2010-01-06T17:19:44.373 回答
0

@"Hello" 不需要随代码发布,

只需注意对象是由“alloc”创建的,其他没有内存泄漏问题

于 2010-01-06T17:53:19.353 回答