首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ios中的内存管理

ios中的内存管理
EN

Stack Overflow用户
提问于 2013-11-13 10:38:20
回答 1查看 59关注 0票数 0

谁能解释一下为什么case1和case2会崩溃,而其他人在非ARC的情况下不会崩溃?

代码语言:javascript
复制
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];
EN

回答 1

Stack Overflow用户

发布于 2013-11-13 10:45:13

所有的都是不正确的,因为最终所有的都会发布两次,但有些可能碰巧不会崩溃。

alloc分配保留计数为1的对象。release减少保留计数1。autorelease最终减少保留计数1。这意味着所有对象都被过度释放。

但正如@Chuck提到的,一些实例是常量,在编译时创建,并且永远不会释放,因此releaseautorelease可以调用很多次而不会崩溃。

字符串常量就是这种情况的一个例子,在这种情况下,过度释放不会导致崩溃:

NSString *s = @"aa";

即使过度发布它也是可以的,因为编译器足够智能:

NSString *s = [NSString stringWithString:@"aa"];

但是您将从当前的LLVM编译器中得到警告,使用带有文字的stringWithString是多余的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19944199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档