29

我知道在 main 方法中创建了一个自动释放池,所有收到自动释放消息的对象都存储在这个池中,并在池耗尽时被释放。

但人们总是说要避免自动释放对象以避免内存泄漏,从而避免应用程序崩溃。

那么为什么以及在什么情况下我们应该使用 autoreleasepool 呢?

Apple 文档建议我们在使用线程时需要使用它们,因此在线程开始时我们需要创建一个自动释放池,并在线程结束时将其排出,但是如果我们没有完全创建自动释放对象怎么办那么在这种情况下,线程也有必要在线程的开头创建一个自动释放池。

请清除我的困惑。谢谢。

4

1 回答 1

21

你的假设是正确的。当您可以确保特定线程从不使用自动释放对象时,该线程将不需要自动释放池。

避免自动释放池是一个坏建议,硬币有两个方面。使用自动释放的对象会带来一定的开销(尽管在大多数情况下微不足道),应尽可能避免。特别是在一个方法有多个出口或可能遇到异常的情况下,自动释放有助于避免内存泄漏并使代码更清晰。

但请注意,这意味着该线程上的任何内容都不能使用自动释放,包括您可能调用的任何框架。在某些情况下会出现这种情况,例如在经典的生产者/消费者场景中。您有一个生产者创建对象,将它们分派到主线程 runloop,然后可以将它们注册到主线程 autoreleasepool 中。

一般来说,我不建议在没有自动释放池的情况下创建一个执行大量工作(除了简单、长时间运行的计算)的线程。

于 2011-06-18T08:17:10.887 回答