如果main()创建一个NSAutoreleasePool并在退出之前将其排干,这是否重要?

时间:2012-05-13 20:05:36

标签: cocoa memory-management nsautoreleasepool

因为如果main()创建了一个NSAutoreleasePool,并在程序退出之前将其耗尽,那么即使它可以防止内存泄漏,整个进程的内存空间也会随后被释放 - 如果我们释放一小块碎片,如果整个碎片下一个被释放,那有关系吗?事实上,如果它继续处理小块,它不会导致程序退出更慢吗?

drain可以调用release,而dealloc会调用dealloc,但如果drain只是释放内存而不是其他内容(例如关闭文件) ,那么{{1}}将无助于释放记忆)

2 个答案:

答案 0 :(得分:5)

在可能的情况下尽量清理自己,而不是依靠环境为您做好准备,这被认为是一种良好的做法。如果你担心的只是内存使用,那么不,最顶层的池并不是绝对必要的 - 但不是你唯一需要考虑的事情。对象可以在-dealloc方法中执行除可用内存之外的操作(例如,将文件刷新到磁盘,释放罕见的OS资源,或释放在进程退出时未返回到系统的资源。)

更不用说在没有存在池的情况下自动释放对象时的控制台垃圾邮件。

答案 1 :(得分:4)

在程序终止GUI程序期间,不会调用dealloc。它被作为一种特殊情况绕过,以避免减慢关机速度。如果您依赖于dealloc被调用,这一点非常重要,因为没有承诺会这样做。

顶级自动释放池就在那里,系统可以可靠地为缺少自动释放池的线程提供警告(Jonathan指出)。它永远不会真正耗尽GUI程序。它将在命令行程序中耗尽,并且可能会减慢程序的完成速度,但这通常不是一个大问题。如果它在您的命令行应用程序中,您可以移动自动释放池排放之前的exit()