Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 创建新线程会导致自动释放内存泄漏_Iphone_Objective C_Multithreading_Memory Management - Fatal编程技术网

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

Iphone 创建新线程会导致自动释放内存泄漏,iphone,objective-c,multithreading,memory-management,Iphone,Objective C,Multithreading,Memory Management,我使用以下代码创建了一个新线程: [NSThread detachNewThreadSelector:@selector(backgroundMethod:) toTarget:self withObject:paramObject]; 然后在backgroundMethod中,我按照常规设置了一个新的自动释放池

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

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

它似乎在抱怨detachNewThreadSelector:调用不是在自动释放池就绪的情况下进行的,而不是backgroundMethod函数中的某个调用,因此当backgroundMethod完成执行时,线程对象正在泄漏


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

它似乎在抱怨detachNewThreadSelector:调用不是在自动释放池到位的情况下进行的,而不是backgroundMethod函数中的某个调用,因此,当backgroundMethod完成执行时,线程对象正在泄漏


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

刚刚检查,主线程上设置了自动释放池,因此这不是问题所在。是[池排放]还是[池释放]重要吗?我一直在用谷歌搜索这个问题,这两个问题似乎都被使用了。你能发布创建主线程自动释放池的代码吗?创建新NSThread的代码是否从主线程运行?完成。是的,它在主线程上(只有两个线程,一个是主线程,另一个是内存泄漏的线程)。在创建新线程之前,您是否在任何地方释放或耗尽主线程NSAutoReleasePool?在我看来,要么是这样,要么是对创建新线程的方法的调用以某种方式错误地发生在另一个线程上,可能是由于performSelectorInBackground或其他原因。我不知道有什么,这是我第一次在项目中使用多线程。不过我会好好找一找,看看能不能找到什么。只是检查了一下,在主线程上设置了一个自动释放池,所以这不是问题所在。是[池排放]还是[池释放]重要吗?我一直在用谷歌搜索这个问题,这两个问题似乎都被使用了。你能发布创建主线程自动释放池的代码吗?创建新NSThread的代码是否从主线程运行?完成。是的,它在主线程上(只有两个线程,一个是主线程,另一个是内存泄漏的线程)。在创建新线程之前,您是否在任何地方释放或耗尽主线程NSAutoReleasePool?在我看来,要么是这样,要么是对创建新线程的方法的调用以某种方式错误地发生在另一个线程上,可能是由于performSelectorInBackground或其他原因。我不知道有什么,这是我第一次在项目中使用多线程。不过我会好好找一找,看看能不能找到什么。你们只有一个排水管?“//method stuff here…”部分中没有其他内容?正在进行的
detachNewThreadSelector:
调用在哪里?也就是说,在那里设置一个断点,抓取回溯并发布它。你只有一个排水管?“//method stuff here…”部分中没有其他内容?正在进行的
detachNewThreadSelector:
调用在哪里?也就是说,在那里设置一个断点,抓取回溯并发布它。