【发布时间】:2010-12-28 16:45:30
【问题描述】:
每个线程都必须有自己的池吗?我正在编写一个使用线程的 iPhone 应用程序。如果我没有在线程上放置一个池,它会抱怨泄漏。
我想做的是存储一些比线程寿命更长的对象。我该怎么做?
【问题讨论】:
标签: iphone cocoa cocoa-touch nsthread
每个线程都必须有自己的池吗?我正在编写一个使用线程的 iPhone 应用程序。如果我没有在线程上放置一个池,它会抱怨泄漏。
我想做的是存储一些比线程寿命更长的对象。我该怎么做?
【问题讨论】:
标签: iphone cocoa cocoa-touch nsthread
不,每个NSThread 都有自己的NSRunLoop,但没有自己的NSAutoreleasePool。因此,您必须创建一个,如果您正在执行大型操作或需要大量时间的操作,您真的应该不时 drain 池以保持低内存占用。
对象存储根本不绑定到线程,您可以从所需的每个线程访问每个对象,但对象的访问器可能不是线程安全的,因此会杀死您的应用程序。但是,这取决于您的应用和代码,而不是线程。
【讨论】:
-init 或copy 进行初始化。跨度>
确切地说 JustSid 所说的:当对对象调用 autorelease 时,将使用与当前线程关联的 autoreleasepool。所以如果你的线程没有关联自动释放池,自动释放将不起作用,导致内存泄漏。
最终的答案是:如果您的线程创建对象并依靠自动释放机制来释放它们,那么您需要为该线程创建一个自动释放池!
【讨论】:
如果您不需要与线程关联的运行循环,则需要手动创建一个自动释放池。我建议将一个对象的所有权转移到另一个线程,你让它明确而不是试图依赖自动释放;在保留它的更长寿命的线程上调用某种“获取所有权”方法。
【讨论】: