我使用以下代码创建了一个新线程:
[NSThread detachNewThreadSelector:@selector(backgroundMethod:)
toTarget:self
withObject:paramObject];
然后在backgroundMethod中我按照惯例设置了一个新的自动释放池:
-(void)backgroundMethod:(id)parameter
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//method stuff here...
[pool drain];
}
但不知何故,自动释放池无效。运行代码时,控制台中的输出如下:
2011-02-17 00:38:16.928 audioEngine[13670:af03] *** __NSAutoreleaseNoPool(): Object
0x4b22370 of class NSThread autoreleased with no pool in place - just leaking
我之前以同样的方式使用过多个线程并且没有类似的问题 - 我做错了什么?
非常感谢任何帮助!谢谢:))
编辑:好吧这看起来有点奇怪 - 我在创建新线程的方法中创建了一个自动释放池,问题就消失了。任何想法为什么这可能是什么以及正确的解决方法应该是什么?我宁愿在我的代码中没有随机的自动释放池,也不知道它实际上在做什么以及问题消失的原因。
EDIT2:以下是创建主要自动释放池的代码:
int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}
答案 0 :(得分:1)
似乎有人抱怨detachNewThreadSelector:调用是那个没有自动释放池的调用,而不是backgroundMethod函数中的调用,所以当backgroundMethod完成执行时,线程对象就是泄漏。
检查创建后台线程的线程(主线程)是否设置了自动释放池。