【问题标题】:Over-release an object and the app does not crash过度释放对象,应用程序不会崩溃
【发布时间】:2012-03-22 12:08:19
【问题描述】:
@property (retain) NSString *testString;
self.testString = [[NSString alloc] initWithString:@"aaa"];
[self.testString retain];    
self.testString = [NSString stringWithString:@"a"];
[self.testString release];
[self.testString release];

让我们逐行进行:

第 2 行:保留 testString 的计数 = 2
第 3 行:保留 testString 的计数 = 3
第 4 行:保留 testString 的计数 = 1
第 5 行:保留 testString 的计数 = 0
第 6 行:它应该崩溃

即使在 CoreFoundation 中还有其他东西持有 testString,它最终也会消失。但该应用永远不会因此而崩溃。

谁能解释一下?谢谢!

【问题讨论】:

  • 与您的问题没有直接关系,但为什么[self retain]; 会增加testString 的保留计数?
  • @rokjarc:这是一个错字,已修复。谢谢=)

标签: ios objective-c memory-management


【解决方案1】:

查看此代码及其日志:

NSString *string1 = [NSString stringWithString:@"a"];
NSString *string2= @"a";
NSLog(@"String1: %p", string1);
NSLog(@"String2: %p", string2);

2012-03-22 13:21:49.433 TableDemo[37385:f803] String1: 0x5860
2012-03-22 13:21:49.434 TableDemo[37385:f803] String2: 0x5860

如您所见,[NSString stringWithString:@"a"]; 不会创建新字符串,它使用字符串文字 @"a"。并且字符串文字不能被释放。

用NSMutableString 试试你的代码,你会看到一个崩溃。

【讨论】:

    【解决方案2】:

    我不是这方面的专家,所以请谨慎对待。我猜[NSString stringWithString:@"a"] 可能只会返回文字字符串@"a",即它只是返回它的参数。由于@"a" 是一个字面量,它可能驻留在常量内存中并且不能被释放(因此它应该使用非常高的保留计数进行初始化)。

    【讨论】:

    • 是的,我刚刚尝试用[NSString stringWithFormat:@"%@%@", @"a", @"b"]; 替换它,它立即崩溃了。谢谢=)。
    • 您是在 5 分钟窗口内更改了答案还是我完全失明了?我真的在 5 分钟后发布了同样的内容......
    • @Matthias:我点击错了,MrMage 先得到了它,所以我认为接受他的回答是公平的。不过为你点赞。
    • 实际上他应该得到所有的支持。他的速度更快。我只是想知道他的答案是否被编辑过,或者我是否停止阅读“我不是专家”^^
    • 我没有编辑我的答案,但我也赞成你的实际例子。
    【解决方案3】:

    [NSString stringWithString:@"a"] 返回一个自动释放的对象。这意味着“真正的”保留计数在第 4 行中是 2 而不是 1。在第 6 行中,您正在过度释放变量,但崩溃将在稍后发生 - 在自动释放池耗尽时。

    【讨论】:

      猜你喜欢
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      相关资源
      最近更新 更多