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