我正在通过以下方法创建一个NSString类型的对象
NSString *str = [[NSString alloc] initWithString:@"aaaaaaaaaaaaaaa"];
NSLog(@"retain count == %d",[str retainCount]);
之后我只打印保留计数值
2010-10-29 17:04:03.939示例[1580:207]保留计数== 2147483647
任何人都可以回答这个为什么这里的日志打印这样的垃圾值
谢谢,
答案 0 :(得分:18)
对象的绝对保留计数毫无意义。
您应该调用release
与导致保留对象完全相同的次数。不会少(除非你喜欢泄漏),当然,没有更多(除非你喜欢崩溃)。
有关详细信息,请参阅Memory Management Guidelines。
在这种特定情况下,您通过调用retain
导致一个alloc
,因此,您需要在某处,任何地方呼叫release
(或autorelease
) ,在你的代码中。
答案 1 :(得分:14)
您正在从字符串文字创建不可变的NSString对象。字符串文字是在编译时创建的,并在程序的整个运行时间内生效 - 因此无法取消分配,保留/释放对它没有影响。为了优化(因为你的NSString无论如何都是不可变的)-initWithString:
方法只能返回传递给它的字符串,以便字符串文字地址被分配给你的str变量。
如果您将初始化代码更改为-initWithFormat:
,那么我认为您将获得预期的保留计数值
答案 2 :(得分:1)
常量和文字保留count = INT_MAX,它们不能被释放,因为它们是单独分配而不是在堆上与其他对象分配(afaik)
答案 3 :(得分:0)
您的值为UINT_MAX = 0x7FFFFFFF
您可以在类中重写此方法以实现您自己的引用计数方案。对于永远不会被释放的对象(即,它们的释放方法什么都不做),此方法应该返回UINT_MAX,如limits.h中所定义。
它是静态字符串,然后对象不能是dealloc。