我正在为ARC重构我的OS X应用程序。打开main.m文件,我确信我会找到Autorelease Pool实例化和排空(比如iOS项目),但令我惊讶的是它不在那里。
所以我的第一个问题是:
我的下一个问题是:
答案 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文件,并运行应用程序,从而请求 它开始处理主事件循环上收到的事件。