【问题标题】:Does every thread need its own autorelease pool?每个线程都需要自己的自动释放池吗?
【发布时间】:2010-12-28 16:45:30
【问题描述】:

每个线程都必须有自己的池吗?我正在编写一个使用线程的 iPhone 应用程序。如果我没有在线程上放置一个池,它会抱怨泄漏。

我想做的是存储一些比线程寿命更长的对象。我该怎么做?

【问题讨论】:

    标签: iphone cocoa cocoa-touch nsthread


    【解决方案1】:

    不,每个NSThread 都有自己的NSRunLoop,但没有自己的NSAutoreleasePool。因此,您必须创建一个,如果您正在执行大型操作或需要大量时间的操作,您真的应该不时 drain 池以保持低内存占用。

    对象存储根本不绑定到线程,您可以从所需的每个线程访问每个对象,但对象的访问器可能不是线程安全的,因此会杀死您的应用程序。但是,这取决于您的应用和代码,而不是线程。

    【讨论】:

    • 那么我怎样才能安全地释放 NSAutorelease 池呢?如果我删除它,就会有泄漏的投诉。
    • 仅在线程生命周期结束时删除它,与此同时,当您出于任何原因需要删除它时,您必须重新创建它。
    • @John - 你不应该删除自动释放池。在线程中创建它,以便它可以管理自动释放的对象,但是在线程完成执行后您希望保留的任何东西都应该手动保留(然后手动释放),或者使用-initcopy 进行初始化。跨度>
    【解决方案2】:

    确切地说 JustSid 所说的:当对对象调用 autorelease 时,将使用与当前线程关联的 autoreleasepool。所以如果你的线程没有关联自动释放池,自动释放将不起作用,导致内存泄漏。

    最终的答案是:如果您的线程创建对象并依靠自动释放机制来释放它们,那么您需要为该线程创建一个自动释放池!

    【讨论】:

    • 我正在尝试相反的方法,以确保它们不会进入自动释放池。
    • @John Smith:但是 Apple 的内部函数也使用了自动释放池,所以很难避免它们。
    • 没错!这就是为什么我总是为每个线程创建一个,除非我确定我不需要它。
    • 所以你的意思是只要线程实例化至少一个自动释放对象就创建自动释放池?
    • @IlkerBaltaci:请改写。
    【解决方案3】:

    如果您不需要与线程关联的运行循环,则需要手动创建一个自动释放池。我建议将一个对象的所有权转移到另一个线程,你让它明确而不是试图依赖自动释放;在保留它的更长寿命的线程上调用某种“获取所有权”方法。

    【讨论】:

      猜你喜欢
      • 2014-04-25
      • 1970-01-01
      • 2014-01-01
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多