每个线程都必须拥有自己的池吗?我正在写一个使用线程的iPhone应用程序。如果我没有在一个线程上放一个池,它就会抱怨漏掉了。
我想要做的是存储一些比线程更长的对象。我该怎么办?
答案 0 :(得分:7)
不,每个NSThread
都有自己的NSRunLoop
,但不是自己的NSAutoreleasePool
。因此,您必须创建一个,如果您正在执行大型操作或需要大量时间的操作,您实际上应该drain
不时地使用池来保持低内存。
对象存储根本没有绑定到一个线程,你可以从你想要的每个线程访问每个对象,但是对象的访问者可能不是线程安全的,因此会杀死你的应用程序。但是,这取决于您的应用和代码,而不是线程。
答案 1 :(得分:3)
准确一点JustSid说的:当在对象上调用autorelease时,使用与当前线程关联的自动释放池。因此,如果没有自动释放池与您的线程相关联,则自动释放将不起作用,从而导致内存泄漏。
最后的答案是:如果您的线程创建了对象并依靠自动释放机制来释放它们,那么您需要为该线程创建一个自动释放池!
答案 2 :(得分:1)
如果您不需要与线程关联的runloop,则需要手动创建自动释放池。我建议将对象的所有权转移到另一个线程,你要明确而不是试图依赖自动释放;在一个保留它的长寿命线程上调用某种“取得所有权”的方法。