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