69

可能重复:
为什么使用自动释放池?

@autoreleasepool{...}所有的 Objective-C 起始页面都会在主函数声明下打开一条默认语句。但是这个声明实际上在做什么?新的 Objective-C 自动释放对象并且删除该行对程序没有任何改变。这个命令真的有必要吗?

4

1 回答 1

97

@autoreleasepool语句执行与以前相同的工作,而不是使用NSAutoreleasePool类。NSAutoreleasePool 的工作方式有点奇怪,因为创建它会在整个应用程序中产生影响;@autoreleasepool创建一个范围区域,并使其更清楚池内的内容以及它何时耗尽(当它超出范围时)。根据苹果的说法,它也更有效率。

自动释放池的概念很简单,每当一个对象实例被标记为自动释放(例如NSString* str = [[[NSString alloc] initWithString:@"hello"] autorelease];)时,它在那个时刻的保留计数就会+1,但是在运行循环结束时,池被耗尽,然后任何标记为 autorelease 的对象的保留计数都会减少。这是一种在您准备任何可以为自己保留对象的同时保留对象的方法。

使用 ARC,虽然autorelease开发人员不使用该方法,但管理 ARC 的底层系统会为您插入该方法。(请记住: ARC 所做的只是插入retainreleaseautorelease在适当的时间呼叫您)。因此,现有的 AutoreleasePool 概念需要保留。

如果您删除自动释放池,您的对象将开始泄漏

在引用计数环境中,Cocoa 期望有一个始终可用的自动释放池。如果池不可用,则自动释放的对象不会被释放,并且您会泄漏内存。在这种情况下,您的程序通常会记录适当的警告消息。

于 2013-02-03T20:58:16.763 回答