首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ARC循环中管理内存而不使用@自动释放池块

如何在ARC循环中管理内存而不使用@自动释放池块
EN

Stack Overflow用户
提问于 2013-06-08 02:09:38
回答 2查看 601关注 0票数 1

和以前一样,我们通常为循环做一些类似于这样的事情:

代码语言:javascript
复制
for (int i = 0 ; i < 5; i ++) {
    NSNumber * number = [[NSNumber alloc] initWithInt:i];
    [muArray addObject:number];
    [number release];
}

但在ARC下,不存在release。我是否可以在没有@autorelease块的情况下管理内存(直接删除发布语句):

代码语言:javascript
复制
for (int i = 0 ; i < 5; i ++) {
    NSNumber * number = [[NSNumber alloc] initWithInt:i];
    [muArray addObject:number];
}

类似地,像这样,@autoreleasepool是必要的吗?

代码语言:javascript
复制
for (int i = 0 ; i < 5; i ++) {
    @autoreleasepool{
        NSNumber * number = [NSNumber numberWithInt:i];
        [muArray addObject:number];
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-08 02:22:59

第二个代码块(用ARC编译)与第一个代码块(用MRC编译)的语义完全相同。

在ARC下,当您将强对象引用设置为零、或强对象引用被销毁时()时,ARC负责为您发送release消息。在这两个示例中,number变量在循环体的末尾被销毁,因此(在第二个示例中) ARC释放number引用的对象。

在您的第三个示例中,@autoreleasepool将导致在每次遍历循环时释放返回的NSNumber。对于大量循环迭代来说,这可能是必要的。对于五个迭代,每个迭代都创建一个NSNumber,这是不必要的。

票数 3
EN

Stack Overflow用户

发布于 2013-06-08 02:21:00

是的,ARC会把你的第二个例子翻译成第一个。

您可以阅读更多的这里(苹果文档)这里(博士)(杜布斯)

自动释放池示例也应该是等效的,llvm文档

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

https://stackoverflow.com/questions/16995328

复制
相关文章

相似问题

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