谁能解释一下为什么case1和case2会崩溃,而其他人在非ARC的情况下不会崩溃?
Case1:
NSString *rr = [[NSString alloc] initWithString:@"AB"];
[rr release];
[rr autorelease];
Case2:
NSString *rrr = [[NSString alloc] initWithString:@"AB"];
[rrr autorelease];
[rrr release];
Case3:
NSMutableString *rr1 = [[NSMutableString alloc] initWithString:@"AB"];
[rr1 release];
[rr1 autorelease];
Case4:
NSMutableString *rrr1 = [[NSMutableString alloc] initWithString:@"AB"];
[rrr1 autorelease];
[rrr1 release];
Case5:
NSArray *rr3 = [[NSArray alloc] initWithObjects:@"jj", nil];
[rr3 release];
[rr3 autorelease];
Case6:
NSArray *rrr3 = [[NSArray alloc] initWithObjects:@"jj", nil];
[rrr3 autorelease];
[rrr3 release];
Case7:
NSMutableArray *rr2 = [[NSMutableArray alloc] initWithObjects:@"jj", nil];
[rr2 release];
[rr2 autorelease];
Case8:
NSMutableArray *rr2 = [[NSMutableArray alloc] initWithObjects:@"jj", nil];
[rr2 autorelease];
[rr2 release];发布于 2013-11-13 10:45:13
所有的都是不正确的,因为最终所有的都会发布两次,但有些可能碰巧不会崩溃。
alloc分配保留计数为1的对象。release减少保留计数1。autorelease最终减少保留计数1。这意味着所有对象都被过度释放。
但正如@Chuck提到的,一些实例是常量,在编译时创建,并且永远不会释放,因此release和autorelease可以调用很多次而不会崩溃。
字符串常量就是这种情况的一个例子,在这种情况下,过度释放不会导致崩溃:
NSString *s = @"aa";
即使过度发布它也是可以的,因为编译器足够智能:
NSString *s = [NSString stringWithString:@"aa"];
但是您将从当前的LLVM编译器中得到警告,使用带有文字的stringWithString是多余的。
https://stackoverflow.com/questions/19944199
复制相似问题