我知道在main方法中创建了一个自动释放池,并且所有接收自动释放消息的对象都存储在此池中,并在池耗尽时释放。
但总是说它可以避免自动释放对象以避免内存泄漏,从而避免应用程序崩溃。
那么我们为什么以及在哪些条件下使用autoreleasepool?
Apple文档建议我们在使用线程时需要使用它们,所以在线程的开头我们需要创建一个自动释放池,并在线程的最后排除它但是如果我们不创建自动释放对象该怎么办?在完整的线程中然后在该条件下也需要在线程的开头创建一个autoreleasepool。
请清除我的困惑。 感谢名单。
答案 0 :(得分:20)
你的假设是正确的。当您可以确保特定线程永远不会使用自动释放的对象时,该线程将不需要自动释放池。
避免autoreleasepool是一个不好的建议,硬币有两面。使用自动释放的对象会带来一定的开销(尽管在大多数情况下都是微不足道的),应该尽可能避免。特别是在方法有多个出口或可能遇到异常的情况下,自动释放有助于避免内存泄漏并使代码更清晰。
请注意,这意味着该线程上的任何内容都不能使用自动释放,包括您可能调用的任何框架。在某些情况下,例如在传统的生产者/消费者场景中。你有一个创建对象的生产者,将它们分派到主线程runloop,然后可以在主线程autoreleasepool中注册它们。
一般情况下,我不建议在没有autoreleasepool的情况下创建一个执行重要工作的线程(除了简单的长时间运行的计算)。