retainCount显示MaxInt

时间:2011-09-08 15:06:00

标签: iphone objective-c ios xcode4

在尝试打印retainCount对象后,我得到2147483647.为什么我会得到这样的结果?应该是1,不应该吗?

NSString *myStr = [NSString new];
NSUInteger retCount = [myStr retainCount];
NSLog(@"refCount = %u", retCount);
  

2011-09-08 17:59:18.759测试[51972:207] refCount = 2147483647

我使用XCode版本4.1。尝试编译器GCC 4.2和LLVM GCC 4.2 - 相同的结果。 垃圾收集选项设置为不受支持。

4 个答案:

答案 0 :(得分:15)

在内存管理方面,

NSString有点特别。字符串文字(类似@"foo")是有效的单例,每个具有相同内容的字符串都是同一个对象,因为它无论如何都无法修改。由于[NSString new]总是创建一个无法修改的空字符串,因此您将始终获得无法释放的相同实例(因此高retainCount)。

试试这个代码段:

NSString *string1 = [NSString new];
NSString *string2 = [NSString new];
NSLog(@"Memory address of string1: %p", string1);
NSLog(@"Memory address of string2: %p", string2);

您将看到两个字符串具有相同的内存地址,因此是同一个对象。

答案 1 :(得分:12)

这并没有直接回答你的问题,但retainCount实际上并不是那么有用,不应该用于测试。有关详细信息,请参阅此SO帖子 When to use -retainCount?

答案 2 :(得分:4)

虽然NSString是一个奇怪的例子(框架中还有其他的)你也可能在其他条款中碰到这个 - 这是创建单例对象的方法之一。

一个单身人士只在应用程序中存在一次,它永远不会被释放非常重要!因此,它将覆盖NSObject的一些方法,包括(但不限于):

- (id)release {
    // Ignore the release!
    return self;
}

- (NSUInteger)retainCount {
    // We are never going to be released
    return UINT_MAX;
}

这个对象永远不会被释放,并且通过具有非常高的保留计数告诉框架它是单例。

结帐this link以获取有关单件对象的更多信息。

答案 3 :(得分:1)

我已经看过几次关于NSStrings的事情,当你试图以这种方式查看retainCounts字符串时,retainCount返回最大数而不是实际数。

试试这个;

NSString *myStr = [[NSString alloc] init];
NSUInteger retCount = [myStr retainCount];
NSLog(@"refCount = %u", retCount);

编辑:恢复NSUInteger