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

时间:2011-02-28 04:19:48

标签: objective-c cocoa

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

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

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

    [pool drain];
}
  • 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);
}

3 个答案:

答案 0 :(得分:4)

Q1:神奇的是NSObject -autorelease实例方法调用NSAutoreleasePool + addObject:class方法。 NSObject实例汇集在当前的NSAutoreleasePool实例中。 NSAutoreleasePool -drain实例方法调用池化实例的释放方法。

Apple和GNUstep的Cocoa实现之间并不完全相同,但它是相似的。

我不确定为什么月份没有发布,应该通过排水来释放。

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

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

答案 1 :(得分:3)

Q1:

您不需要在给出的示例中释放month实例,因为您正在调用的NSArray类方法(arrayWithObjects:)返回一个自动释放的实例。按照惯例,在Cocoa中,以类名开头的类方法将返回该类的自动释放实例。这些例子:

[NSString stringWithFormat:@"Holla %@", @"back girl!", nil];
[NSArray arrayWithObjects:@"Holla", @"back", @"girl!", nil];

两者都会返回自动释放的各自对象的实例。

答案 2 :(得分:0)

我对Objective C很新,但是让我给出一个解决方案:

自动释放池是Objective C以一种比手动更简单的方式处理垃圾收集的一种方式。

它通过计算引用来实现,或者在每次调用“retain”或“release”时都这样做。

因此,如果你在“a”中有一个对象的实例,你可以这样做:

这将它放入AutoreleasePool: [a autorelease];

这告诉自动释放池你要暂时保留它: [a retain];

当你现在调用[pool drain]时,它会注意到你有一个对a的引用,它不会释放内存。但是,如果您稍后调用[a release],则在下次调用[pool drain]时,它会看到没有对剩余内容的进一步引用,并释放内存。

我有一种潜在的怀疑,我只是在圈子里谈论自己并没有太多意义,但这里有关于引用计数的维基百科文章:http://en.wikipedia.org/wiki/Reference_counting