OS X应用程序的自动释放池在哪里创建并耗尽?

时间:2011-11-17 08:58:51

标签: macos cocoa automatic-ref-counting autorelease nsautoreleasepool

我正在为ARC重构我的OS X应用程序。打开main.m文件,我确信我会找到Autorelease Pool实例化和排空(比如iOS项目),但令我惊讶的是它不在那里。

所以我的第一个问题是:

  • 主要的Autorelease Pool在哪里?

我的下一个问题是:

  • 如果未创建主要自动释放池,是否需要创建它?或者以某种自动方式释放自动释放的对象?

2 个答案:

答案 0 :(得分:6)

您的main.m文件应该有以下调用:

NSApplicationMain(argc, (const char **)argv);

NSApplicationMain()负责创建应用程序,即NSApplication的实例,而后者又负责创建自动释放池:

  

NSApplication类在初始化期间和事件循环内部设置自动释放池(NSAutoreleasePool类的实例) - 特别是在其初始化(或sharedApplication)和运行方法中。

这意味着,在一般情况下,您不必担心创建自动释放池,因为NSApplication已经在初始化和事件循环中都这样做了。在某些情况下,创建自己的自动释放池可能是必要/可取的,例如一个循环创建许多自动释放对象的方法。在这种情况下,为每个循环迭代创建一个自动释放池是个好主意。

答案 1 :(得分:1)

通常情况下,Apple的文档中已经很好地介绍了这个主题。例如,查看this Cocoa Fundamentals Guide chapter主要功能部分中发生的事情。引用与此问题相关的部分(已由Bavarious解释):

  

几乎所有Cocoa应用程序中的主要功能都非常强大   简单。在Mac OS X中,它只包含一个函数调用。

#import <AppKit/AppKit.h>

int main(int argc, const char *argv[]) {
    return NSApplicationMain(argc, argv);
}
  

NSApplicationMain函数创建应用程序   对象,设置自动释放池,加载初始用户界面   从主nib文件,并运行应用程序,从而请求   它开始处理主事件循环上收到的事件。