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