首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于ARC,AutoRelease的困惑

关于ARC,AutoRelease的困惑
EN

Stack Overflow用户
提问于 2013-12-13 18:08:56
回答 3查看 586关注 0票数 3

我是IOS开发的新手,我已经开始学习目标c来编写面向IOS 7的程序。据我所知,由于自动引用计数,现在编写代码要比以前容易得多。有几件事我不明白。在主要的方法中,我们有自动释放池块,所以我的第一个问题是,为了启用ARC,代码必须在这个块内?如果不是,那么自动释放池中的代码与其他代码之间的区别是什么呢?

我的第二个问题是,当我编写我的IPHONE程序时,我有很多类,这些代码中没有一个在“自动发布池”中,只有主方法中的代码。

代码语言:javascript
复制
 int main(int argc, char * argv[])
 {
     @autoreleasepool {
    return UIApplicationMain(argc, argv, nil, 
    NSStringFromClass([HomepwnerAppDelegate class]));
 }
}

那么,这是否意味着这个块以某种方式神奇地应用于同一程序的任何其他类中的所有代码行?

我的最后一个问题是,无论是否使用ARC,如果方法中有一个声明的指针变量,当方法返回/退出时,该对象是否会被释放/销毁?

假设我们有这样的方法:

代码语言:javascript
复制
- (void)doSomething {
 NSMutableArray *allItems = [[NSMutableArray alloc] init];
 NSString *myString = @"sample string";
 [allItems addObject:myString]
 }

然后,当我们调用该方法并退出时,在方法中定义的局部变量会发生什么情况?如果我们使用ARC或不使用ARC,结果是否有差别?(对象是否仍在内存中)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-13 18:36:09

自动释放池比ARC早15年。可可使用一种引用计数内存管理方案,其中(至少在概念上)创建引用计数为1的对象,retain将其增加1,而release将计数减少1,当计数达到0时,对象被销毁。

这种方案的一个问题是,它使返回对象变得有些尴尬,因为在返回对象之前不能释放它--如果是这样的话,它可能在其他方法使用之前就被销毁了--但是您也不想要求另一种方法释放对象。这就是自动释放池进来的地方。自动释放池允许您将一个对象传递给它,并且它保证稍后会为您释放该对象。在手动保留/发布(我们以前在ARC之前做事情的方式)下,您可以通过向对象发送autorelease来完成这一任务。

好的,然后ARC进入画面。唯一真正改变ARC的是,您不再是编写retainreleaseautorelease的人了--编译器会为您插入它们。但是,要进入自动释放对象,仍然需要一个自动释放池。

至于你的第二个问题:

我的最后一个问题是,无论是否使用ARC,如果方法中有一个声明的指针变量,当方法返回/退出时,该对象是否会被释放/销毁? 假设我们有这样一个方法:

  • (DoSomething){ NSMutableArray *allItems = [NSMutableArray alloc init];NSString *myString = @"sample string";allItems addObject:myString } 然后,当我们调用该方法并退出时,在方法中定义的局部变量会发生什么情况?如果我们使用ARC或不使用ARC,结果是否有差别?

如果使用ARC,编译器将释放局部变量引用的任何对象。如果您不使用[allItems release],则需要自己编写,因为超出作用域的变量不会神奇地导致释放它引用的对象。

票数 4
EN

Stack Overflow用户

发布于 2013-12-13 18:22:36

IOS开发的新技术

最好不要担心,自动意味着你主要集中精力于其他事情^)

这是否意味着这个块以某种方式神奇地应用于同一程序的任何其他类中的所有代码行?

是。您是在main函数中,所以执行的所有代码都必须在这个函数中--一旦应用程序结束,它就会终止。除非您创建了一个单独的线程,但很难偶然地做到这一点。

代码必须在这个块内。

如前所述,主线程上的所有代码都将在这个块中执行。

在方法中定义的局部变量会发生什么情况?

你保证他们会在回来之前被摧毁。

票数 2
EN

Stack Overflow用户

发布于 2013-12-13 18:40:25

在主要的方法中,我们有自动释放池块,所以我的第一个问题是,为了启用ARC,代码必须在这个块内?如果不是,那么自动释放池中的代码与其他代码之间的区别是什么呢?

通过相应的Objective编译器设置启用ARC。如果您在最新版本的Xcode中创建了一个新项目,默认情况下它将被启用。

@autorelease关键字将花括号中的代码放入自动释放池作用域中。自动释放池与ARC和手动内存管理一起使用。

我的第二个问题是,当我编写我的IPHONE程序时,我有很多类,这些代码中没有一个在“自动发布池”中,只有主方法中的代码。

iOS应用程序是基于事件的。当调用UIApplicationMain函数处理触摸事件、通知等时,主线程启动事件循环。该事件循环有自己的自动释放池,在循环迭代结束时自动释放对象。这个自动释放池与您在主函数中看到的自动释放池无关。

我的最后一个问题是,无论是否使用ARC,如果方法中有一个声明的指针变量,当方法返回/退出时,该对象是否会被释放/销毁?

如果使用ARC,则将释放对象(除非从方法中返回对对象的引用)。在MMR中,您需要手动发送release消息来销毁对象。

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

https://stackoverflow.com/questions/20573157

复制
相关文章

相似问题

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