0

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];
4

1 に答える 1

3

最終的にはすべてが 2 回リリースされるため、すべてが正しくありませんが、偶然にもクラッシュしないものもあります。

alloc、保持カウント 1 でオブジェクトを割り当てます。保持カウントを 1release減らします。autorelease最終的に保持カウントを 1 減らします。つまり、すべてがオーバー リリースされます。

しかし、@Chuck が言及しているように、一部のインスタンスは定数であり、コンパイル時に作成され、リリースされることはなく、クラッシュすることなく多くの tines を呼び出すことができますreleaseautorelease

文字列定数は、これの 1 つのインスタンスです。過剰に解放してもクラッシュは発生しません:
NSString *s = @"aa";
過剰に解放しても問題ありません。これは、コンパイラが十分にスマートであるためです
NSString *s = [NSString stringWithString:@"aa"];
: stringWithString.

于 2013-11-13T02:45:12.720 に答える