方法retainCount
应该返回无符号整数。
为什么[@"Hi" retainCount]
会返回-1?
答案 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”创建的其他无内存泄漏问题