创建NSString后保留计数

时间:2010-10-29 11:40:44

标签: iphone

我正在通过以下方法创建一个NSString类型的对象

NSString *str = [[NSString alloc] initWithString:@"aaaaaaaaaaaaaaa"];
    NSLog(@"retain count == %d",[str retainCount]);

之后我只打印保留计数值

2010-10-29 17:04:03.939示例[1580:207]保留计数== 2147483647

任何人都可以回答这个为什么这里的日志打印这样的垃圾值

谢谢,

4 个答案:

答案 0 :(得分:18)

不要使用-retainCount。

对象的绝对保留计数毫无意义。

您应该调用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。