为什么要使用自动释放池?

30

我知道在主方法中会创建自动释放池,所有接收到autorelease消息的对象都会存储在该池中,在池耗尽时被释放。

但是常常说要避免使用自动释放对象以避免内存泄漏和应用程序崩溃。

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

苹果文档建议我们在使用线程时需要使用它们,因此在线程开头我们需要创建一个autorelease pool,在线程末尾排空它,但是如果我们在整个线程中都没有创建一个autorelease对象,那么在这种情况下是否有必要在线程开始时创建autorelease 池呢?

请澄清我的困惑。谢谢。

1个回答

21
您的假设是正确的。当您可以确保特定的线程从未使用自动释放对象时,该线程就不需要自动释放池。
避免使用autorelease池是一个不好的建议,这个问题有两个方面。在可能时应避免使用autorelease对象,因为使用它们会带来一定的开销(尽管在大多数情况下无关紧要)。特别是在方法中存在多个出口或可能遇到异常情况的情况下,自动释放可以帮助避免内存泄漏并使代码更加清晰。
请注意,这意味着在该线程上什么都不能使用自动释放,包括您可能调用的任何框架。存在这种情况,比如在传统的生产者/消费者场景中。您有一个生产者创建对象,将它们分派到主线程的运行循环中,并可以在主线程的autorelease池中注册它们。
总的来说,我不建议在没有自动释放池的情况下创建执行重要工作的线程(除了一个简单的、长时间运行的计算)。

创建一个没有自动释放池的线程会导致内存泄漏吗? - user4951
2
是的,如果你在那个线程上自动释放一个对象并且没有池,你将会有一个泄漏。 - Johannes Rudolph
那个问题是有争议的。https://dev59.com/gGcs5IYBdhLWcg3wym_D - user4951

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接