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

jas*_*inh 4 memory-management objective-c ios

@property (retain) NSString *testString;
self.testString = [[NSString alloc] initWithString:@"aaa"];
[self.testString retain];    
self.testString = [NSString stringWithString:@"a"];
[self.testString release];
[self.testString release];
Run Code Online (Sandbox Code Playgroud)

我们一行一行:

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

即使testString在CoreFoundation中还有其他东西,它最终也会消失.但该应用程序从未因此而崩溃.

有谁能解释一下?谢谢!

Mat*_*uch 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
Run Code Online (Sandbox Code Playgroud)

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

尝试使用您的代码,NSMutableString您将看到崩溃.