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