gpt4 book ai didi

iphone - 从回调函数线程化时的“Just Leaking”

转载 作者:行者123 更新时间:2023-12-03 13:21:58 27 4
gpt4 key购买 nike

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

当我从obj-c方法或C函数中启动新的NSThread时,一切正常:

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

(thisSelf = self,我使用它可以从C函数内部启动线程)

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

为什么泄漏?我无法弄清楚如何避免这种情况,因为在方法“hello”中创建NSAutoreleasePool似乎无法解决此问题。
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// code of method "hello" here
[pool release];

有什么见解/建议吗?

最佳答案

问题是+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

关于iphone - 从回调函数线程化时的“Just Leaking”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5006564/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com