【问题标题】:What is autoreleasepool? [duplicate]什么是自动释放池? [复制]
【发布时间】:2013-01-18 13:55:58
【问题描述】:

可能重复:
Why use Autorelease pool?

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

【问题讨论】:

标签: objective-c object release autorelease nsautoreleasepool


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 这是否意味着如果我使用 ARC 并从 @autoreleasepool{} 之外的某个地方释放一个对象,该对象仍然存在,直到 @autoreleasepool 块结束?
  • 如果您手动释放自动释放的对象,当您到达自动释放池的末尾时,dealloc 的对象将不再存在,您可能会在框架或机器代码的某个地方遇到异常。如果它是一段很长的代码路径,您的应用可能会在看似不相关的地方崩溃,从而导致混乱。
猜你喜欢
  • 2011-09-17
  • 2010-11-26
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多