因为如果main()
创建一个NSAutoreleasePool
,并在程序退出之前将其耗尽,那么即使它可以防止内存泄漏,整个过程的内存空间无论如何都会被释放出来 - 如果接下来释放整个部分,我们是否释放小块重要吗? 事实上,如果它继续处理小块,它不会导致程序退出得更慢吗?
(drain
可以调用release
,而又调用dealloc
,但如果dealloc
只是释放内存而不释放其他任何内容(例如关闭文件),那么drain
将无助于释放内存)
在可能的情况下清理自己被认为是很好的做法,而不是依靠环境来为你做。如果您只担心内存使用情况,那么不,最顶层的池不是绝对必要的 - 但这不是您唯一需要考虑的事情。对象可以在其-dealloc
方法中执行释放内存以外的操作(例如,将文件刷新到磁盘、释放稀有的操作系统资源或释放在进程退出时不会返回到系统的资源)。
更不用说在没有池的情况下自动释放对象时的控制台垃圾邮件。
在 GUI 程序的程序终止期间,不会调用 dealloc
。它作为特殊情况被绕过,以避免减慢关机速度。如果您依赖被调用dealloc
,这一点很重要,因为没有承诺它会被调用。
顶级自动释放池在那里,以便系统可以可靠地为您提供缺少自动释放池的线程的警告(Jonathan指出)。它永远不会真正消耗在 GUI 程序中。它会在命令行程序中耗尽,并且可能会减慢程序完成速度,但这通常不是一个大问题。如果它位于命令行应用中,则可以在自动释放池排出之前移动exit()
。