在尝试打印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 - 相同的结果。 垃圾收集选项设置为不受支持。
答案 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