为什么要使用Autorelease池?

Ais*_*sha 28 memory-management objective-c nsautoreleasepool

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

但总是说它可以避免自动释放对象以避免内存泄漏,从而避免应用程序崩溃.

那么我们为什么以及在哪些条件下应该使用autoreleasepool?

Apple文档建议我们在使用线程时需要使用它们,所以在线程的开头我们需要创建一个自动释放池,并在线程的最后排空它但是如果我们不在完整中创建自动释放对象该怎么办?然后在该条件下线程也需要在线程的开头创建一个autoreleasepool.

请清除我的困惑.感谢名单.

Joh*_*lph 20

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

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

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

一般来说,我不建议创建一个没有自动释放池的重要工作(除了一个简单的,长时间运行的计算)的线程.

  • 是的,如果您在该线程上自动释放对象并且没有池,则会发生泄漏. (2认同)