过度释放对象,应用程序不会崩溃

时间:2012-03-22 12:08:19

标签: ios objective-c memory-management

@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,它最终也会消失。但该应用程序从未因此而崩溃。

有人可以解释一下吗?谢谢!

3 个答案:

答案 0 :(得分:5)

请参阅此代码及其日志:

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尝试使用您的代码,您会看到崩溃。

答案 1 :(得分:4)

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

答案 2 :(得分:0)

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