Objective-C/cocoa框架中NSAutoreleasePool的神奇之处是什么?

pro*_*eek 6 cocoa objective-c

我发现Objective-C/cocoa框架的一个例子有以下代码.

int main()
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // Create an array
    NSArray *month = [NSArray arrayWithObjects:@ ... nill];

    [pool drain];
}
Run Code Online (Sandbox Code Playgroud)
  • Q1:这背后的魔力是什么(为什么我需要NSAutoreleasePool代码?)?NSAutoreleasePoolpool drain块之间发生了什么魔力?我觉得我不需要释放*month自己.这是因为它在NSAutoreleasePoolpool drain块内吗?

  • Q2:使用Xcode,我已经获得了main()函数.在这种情况下,我该如何使用NSAutoreleasePoolpool drain

例如 :

int main(int argc, char *argv[])
{
    //NSAutoreleasePool *pool = [[[NSAutoreleasePool] alloc] init];
    return NSApplicationMain(argc,  (const char **) argv);
}
Run Code Online (Sandbox Code Playgroud)

Kaz*_*oto 4

Q1:神奇的是 NSObject -autorelease 实例方法调用 NSAutoreleasePool +addObject: 类方法。NSObject 实例被池化在当前的 NSAutoreleasePool 实例中。NSAutoreleasePool -drain 实例方法调用池化实例的release方法。

Apple 的 Cocoa 实现与 GNUstep 之间并不完全相同,但也很相似。

我不知道为什么月份不被释放,它应该通过排水管释放。

Q2:你可以在任何你想使用的地方使用 NSAutoreleasePool 。实例化 NSAutoreleasePool 意味着当前池将被新实例更改。Drain 会将当前池返回到前一个实例。

除此之外 NSApplicationMain 永远不会返回。它调用 exit 函数来退出应用程序并终止进程。