@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
,它最终也会消失。但该应用程序从未因此而崩溃。
有人可以解释一下吗?谢谢!
答案 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行中,您过度释放变量,但崩溃将在稍后发生 - 在自动释放池中消耗。