可能重复:
为什么使用自动释放池?
@autoreleasepool{...}
所有的 Objective-C 起始页面都会在主函数声明下打开一条默认语句。但是这个声明实际上在做什么?新的 Objective-C 自动释放对象并且删除该行对程序没有任何改变。这个命令真的有必要吗?
可能重复:
为什么使用自动释放池?
@autoreleasepool{...}
所有的 Objective-C 起始页面都会在主函数声明下打开一条默认语句。但是这个声明实际上在做什么?新的 Objective-C 自动释放对象并且删除该行对程序没有任何改变。这个命令真的有必要吗?
该@autoreleasepool
语句执行与以前相同的工作,而不是使用NSAutoreleasePool类。NSAutoreleasePool 的工作方式有点奇怪,因为创建它会在整个应用程序中产生影响;@autoreleasepool
创建一个范围区域,并使其更清楚池内的内容以及它何时耗尽(当它超出范围时)。根据苹果的说法,它也更有效率。
自动释放池的概念很简单,每当一个对象实例被标记为自动释放(例如NSString* str = [[[NSString alloc] initWithString:@"hello"] autorelease];
)时,它在那个时刻的保留计数就会+1,但是在运行循环结束时,池被耗尽,然后任何标记为 autorelease 的对象的保留计数都会减少。这是一种在您准备任何可以为自己保留对象的同时保留对象的方法。
使用 ARC,虽然autorelease
开发人员不使用该方法,但管理 ARC 的底层系统会为您插入该方法。(请记住: ARC 所做的只是插入retain
,release
并autorelease
在适当的时间呼叫您)。因此,现有的 AutoreleasePool 概念需要保留。
如果您删除自动释放池,您的对象将开始泄漏
在引用计数环境中,Cocoa 期望有一个始终可用的自动释放池。如果池不可用,则自动释放的对象不会被释放,并且您会泄漏内存。在这种情况下,您的程序通常会记录适当的警告消息。