NSString保留计数-1

时间:2013-03-06 08:46:13

标签: ios nsstring

我想在NSString方法

中的AppDelegate类中打印didFinishLaunchingWithOptions的保留计数

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

但它总是给-1而不是+1 ....为什么???

3 个答案:

答案 0 :(得分:4)

NSUIntegerMax表示返回的对象是不朽的。这曾经在文档中,但后来被删除了(因为非常不鼓励-retainCount)。

在MRC中,有些人实际上会覆盖-retainCount以防止他们的单身人士被解除分配。

在这种情况下,[[NSString alloc] init]返回常量/不朽是一种逻辑优化,而不是为每个请求创建一个空字符串。当然,您不应该依赖程序中的这些细节/行为。

答案 1 :(得分:3)

Apple docs说:

  

特别注意事项

     

此方法在调试内存管理问题时没有任何价值。因为任何数量的框架对象可能保留了一个对象以保存对它的引用,而同时自动释放池可能在对象上保留任意数量的延迟版本,所以您不太可能从此获取有用信息方法

所以你不应指望它的正确性。

此外,-1实际上是最大的无符号整数,而不是负值。保留计数返回NSUInteger,因此您应使用%u代替%d

答案 2 :(得分:1)

通常,您不应再使用-retainCount方法,正如其他人的回答所指出的那样。原因是,许多保留/释放工作是在NSString类中完成的,具体取决于您创建它的方式。当您创建NSString时,您实际上可能正在创建许多NSString个子类中的一个(初始化的id返回类型并不具体)。

所有NSConstantStrings(由@""创建的)都不可释放 - 它们在程序期间存在(由gcc和clang指定)。因此,Apple任意将其retainCount设置为最高可能的无符号整数(如果它被读为带符号,则为-1,因为它在这里),因为对于一个常量对象没有任何意义,该程序, 保留计数。

当你以你的方式创建一个空字符串时,很可能Apple会自动指向内存中的常量@"",因为它在运行时占用的空间更少。由于您的对象现在是NSConstantString,因此将其实现为返回保留计数-1。

编辑:顺便提一下,由于NSConstantStringNSString的子类,因此必须实现NSString实现的方法,包括-retainCount。这就是为什么你可以在一个常量字符串对象上实际调用-retainCount方法(以及为什么Apple使它返回一个特殊值)。可以在NSString.h标题的底部附近找到此继承关系。