【问题标题】:ios: Retain count of 2147483647? [duplicate]ios:保留2147483647的计数? [复制]
【发布时间】:2011-10-21 22:36:57
【问题描述】:

可能的重复:
NSString retainCount is 2147483647
Objective C NSString* property retain count oddity

看看下面的代码:

NSString* testString = [[NSString alloc] initWithString:@"Test"];
NSLog(@"[testString retainCount] = %d", [testString retainCount] );
NSMutableArray* ma = [[NSMutableArray alloc] init];
[ma insertObject:testString atIndex:0];
[testString release];
NSLog(@"%@", [ma objectAtIndex:0]);

这是控制台上的输出:

[testString retainCount] = 2147483647
Test

怎么会这样?我预计 1 不是 2147483647!

【问题讨论】:

标签: ios count retain


【解决方案1】:

对于retainCount的结果只能有两个期望:

1) 它大于 1。你无法预测它实际上是什么数字,因为你不知道还有谁在使用它。你不知道别人如何使用它。这不是你应该关心的数字。

2) 人们会告诉你不要使用它。因为你不应该。使用规则来平衡您的保留和释放。不要使用retainCount。它会让你感到沮丧和困惑,没有任何价值。

【讨论】:

    【解决方案2】:

    您使用 字符串文字 启动您的 NSString 对象,然后发生以下 2 件事:

    1. 由于 NSString 是不可变的 -initWithString: 方法优化了字符串的创建,以便您的 testString 实际上指向您使用 (@"Test") 创建它的同一个字符串
    2. @"Test" 是一个字符串字面量,它是在编译时创建的,并且存在于特定的地址空间中——你不能释放它,释放和保留不会影响它的保留计数,它是总是 INT_MAX

    如上所述,您仍然应该按照内存管理规则使用您的字符串对象(当您使用 alloc/init 创建它时,您应该释放它),您会没事的

    【讨论】:

      猜你喜欢
      • 2016-02-18
      • 1970-01-01
      • 2014-03-28
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      相关资源
      最近更新 更多