3

因为如果main()创建一个NSAutoreleasePool, 并在程序退出之前清空它,那么即使它可以防止内存泄漏,整个进程的内存空间无论如何都会被释放——如果我们释放小块,如果整个块下一个被释放?事实上,如果它继续在小块上工作,会不会导致程序退出速度变慢?

drain可以调用release,然后调用dealloc,但如果dealloc只是释放内存而不是其他(例如关闭文件),那么drain将无助于释放内存)

4

2 回答 2

5

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

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

于 2012-05-13T20:10:07.373 回答
4

在 GUI 程序的程序终止期间,dealloc不调用。它作为一种特殊情况被绕过,以避免减慢关机速度。这在您依赖dealloc被调用的情况下很重要,因为没有保证会这样。

存在顶级自动释放池,因此系统可以可靠地向您发出缺少自动释放池的线程的警告(乔纳森指出)。它永远不会在 GUI 程序中真正耗尽。它会在命令行程序中耗尽,并且可能会减慢程序的完成速度,但这通常不是一个大问题。如果它在您的命令行应用程序中,您可以移动exit()自动释放池耗尽的优先级。

于 2012-05-13T20:15:57.903 回答