retainCount显示MaxInt

Jas*_*all 6 iphone objective-c ios xcode4

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

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

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

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

omz*_*omz 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);
Run Code Online (Sandbox Code Playgroud)

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

  • 另外:这可能是在flyweight设计模式中的原因并且:"对于永远不会被释放的对象(也就是说,它们的释放方法什么都不做),这个方法应该返回UINT_MAX"(引自NSObject-Class-Reference) (4认同)

Sil*_*vae 12

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

  • 检查对象的保留计数的唯一效果是,您最终会回到此处发布有关为什么该号码在没有您的情况下移动的令人困惑的问题.答案是:没有你,这个数字就会移动.所以不要用它来调试你的保留/释放代码. (5认同)
  • +1,没有理由*永远*看好`retainCount`,除了好奇心.如果你评估`retainCount`,那你就做错了. (3认同)