每个线程都需要自己的自动释放池吗?

时间:2010-12-28 16:45:30

标签: iphone cocoa cocoa-touch nsthread

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

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

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:3)

准确一点JustSid说的:当在对象上调用autorelease时,使用与当前线程关联的自动释放池。因此,如果没有自动释放池与您的线程相关联,则自动释放将不起作用,从而导致内存泄漏。

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

答案 2 :(得分:1)

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