我是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];
有任何见解/建议吗?
答案 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];