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

Mat*_*oal 4 macos cocoa autorelease nsautoreleasepool automatic-ref-counting

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

所以我的第一个问题是:

  • 主要的Autorelease Pool在哪里?

我的下一个问题是:

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

小智 6

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

NSApplicationMain(argc, (const char **)argv);
Run Code Online (Sandbox Code Playgroud)

NSApplicationMain()负责创建应用程序,即一个实例,该实例NSApplication又负责创建自动释放池:

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

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