创建新线程导致自动释放内存泄漏

时间:2011-02-16 11:49:13

标签: iphone objective-c multithreading memory-management

我使用以下代码创建了一个新线程:

[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;
}

1 个答案:

答案 0 :(得分:1)

似乎有人抱怨detachNewThreadSelector:调用是那个没有自动释放池的调用,而不是backgroundMethod函数中的调用,所以当backgroundMethod完成执行时,线程对象就是泄漏。

检查创建后台线程的线程(主线程)是否设置了自动释放池。