Xcode,命令行工具:为什么NSAutoreleasePool在生成的模板中?

时间:2010-06-24 20:45:48

标签: objective-c xcode

这是一个初学者问题。

我的目标:了解背后的设计理念。

当我创建一个链接Foundation类的命令行工具项目时,xcode生成了以下代码片段。

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // insert code here...
    NSLog(@"Hello, World!");
    [pool drain];
    return 0;
}

我对NSAutoreleasePool的功能有一些大概的了解。但我不明白为什么我们需要NSAutoreleasePool:在这样一个简单的程序中,当main()完成时,所有alloc'd对象都会被释放。

在这里使用NSAutoreleasePool还有其他原因/优势吗?

2 个答案:

答案 0 :(得分:3)

必须存在自动释放池才能使内存管理系统正常工作。你是对的[pool drain]可能是不必要的,因为操作系统将在进程退出时清理你程序的所有内存,但为了清晰起见(并且严格正确),它包括在内。

我认为这里的假设是你可能会添加使用自动释放池的代码,所以他们只是希望能为你节省一些打字。

答案 1 :(得分:1)

你是正确的,当你编程退出它的内存将被回收,但如果你的程序连续几天运行而不退出(服务器或守护进程)并且你没有自动发布池而你没有发布怎么办?你的对象。然后怎样呢?您的应用将继续消耗内存,直到 - 爆炸 - 内存不足并导致系统崩溃。

那是自动发布池的原因。