从回调函数线程化时“正在泄漏”

时间:2011-02-15 16:41:37

标签: iphone objective-c multithreading

我是iphone编程新手。任何帮助将不胜感激:)

当我从obj-c方法或像这样的C函数开始新的NSThread时,一切正常:

[NSThread detachNewThreadSelector:@selector(hello) toTarget:thisSelf withObject:nil];

(thisSelf = self,我用它来从C函数中启动线程)

但是,如果我有一个C回调函数,从一个单独的C线程调用,而不是以相同的方式启动此NSThread,我得到“NSThread自动释放,没有池到位 - 只是泄漏”

泄漏的原因?我无法弄清楚如何避免这种情况,因为在方法“hello”中创建NSAutoreleasePool似乎无法解决这个问题。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// code of method "hello" here  
[pool release];

有任何见解/建议吗?

3 个答案:

答案 0 :(得分:3)

问题是+detachNewThreadSelector:...创建了一个自动释放的NSThread对象,因此发送该消息的单独C线程也需要一个自动释放池。您可以通过显式创建NSThread对象来避免这种情况:

NSThread* newThread = [[NSThread alloc] initWithTarget: thisSelf 
                                              selector: @selector(hello) 
                                                object: nil];
[newThread start];
[newThread release];  // this might not be OK.  You might need to wait until the thread is finished

虽然,init方法的内部也可能需要一个自动释放池,在这种情况下,你只需要创建一个。

如果使用posix线程创建C线程,则在启动第一个Posix线程时需要notify the Cocoa framework that the application is now multithreaded存在问题。

答案 1 :(得分:0)

你的hello lloks的实现很好。

下:

打破任何符号(NSAutoreleaseNoPool?)并告诉我:从哪个线程调用?

我怀疑您可能没有在创建辅助线程的线程中设置自动释放池。

如果没有,并且它是 new 线程,那么你就不会及早创建自动释放池。

(如果不能为您解决问题,更多代码会有所帮助)

答案 2 :(得分:0)

尝试改变这种方式:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[NSThread detachNewThreadSelector:@selector(hello) toTarget:thisSelf withObject:nil];
[pool drain];