什么是autoreleasepool?

时间:2013-02-03 20:39:56

标签: objective-c object release autorelease nsautoreleasepool

  

可能重复:
  Why use Autorelease pool?

所有Objective-C起始页面打开,主函数声明下有一个默认的@autoreleasepool{...}语句。但这句话到底在做什么呢?新的Objective-C自动释放对象并删除该行不会对程序产生任何影响。这个命令真的有必要吗?

1 个答案:

答案 0 :(得分:80)

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

自动释放池的概念很简单,只要对象实例被标记为自动释放(例如NSString* str = [[[NSString alloc] initWithString:@"hello"] autorelease];),它在那个时刻的保留计数为+1,但是在结束时运行循环,池被耗尽,任何标记为autorelease的对象都会使其保留计数减少。这是一种保持物体周围的方式,同时你准备任何可以保留它的东西。

使用ARC,虽然开发人员不使用autorelease关键字,但管理ARC的基础系统会为您插入。 (请记住:所有ARC正在做的是在适当的时间为您插入retainreleaseautorelease来电。因此,现有的AutoreleasePool概念需要保持不变。

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

  

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