为什么将retainCount发送到@“Hi”返回-1?

时间:2010-01-06 17:01:16

标签: objective-c types retaincount

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

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

5 个答案:

答案 0 :(得分:10)

简单的答案是因为@"Hi“是一个字符串文字,它总是会坐在二进制可执行图像中,永远不会”消失“,因此保留/释放没有效果,而你'看到UINT_MAX(当打印出签名时看起来像-1,例如%d)。(参见Pete Kirkham关于NSObjects有这些语义的答案)。

除此之外,知道虽然@“Hi”表现得像NSString*,但它实际上是编译器创建的类CFConstantString的实例(或者可能是NSConstantString,我的调试器没有同意一些文档),它包装文字字符串数据并为其提供NSString *接口。但编译器知道这些字符串是特殊的,无法清理,所以它们的retainCount总是为UINT_MAX(-1)

答案 1 :(得分:6)

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

答案 2 :(得分:3)

不要依赖retainCount方法。 Cocoa在幕后进行各种优化,使retainCount方法不可靠和无用。即便是Apple也不鼓励使用它。坚持为Cocoa设定的内存管理规则,你永远不需要知道任何对象的retainCount

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

@“Hello”不需要与代码一起发布,

只是关心对象是由“alloc”创建的其他无内存泄漏问题