【问题标题】:Why use Autorelease pool?为什么使用自动释放池?
【发布时间】:2011-09-17 16:39:16
【问题描述】:

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

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

那我们为什么要在什么情况下使用autoreleasepool呢?

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

请消除我的困惑。 谢谢。

【问题讨论】:

    标签: objective-c memory-management nsautoreleasepool


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 创建没有自动释放池的线程会导致内存泄漏吗?
    • 是的,如果你在那个线程上自动释放一个对象并且没有池,你就会有泄漏。
    • 那个是有争议的。 stackoverflow.com/questions/12575010/…
    猜你喜欢
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 2013-04-16
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多