我正在使用NSThread如下

NSThread * thread = [[NSThread alloc] initWithTarget:object selector:@selector(bg) object:nil];
[thread start];


稍后,我要停止线程并按如下所示释放对象:

[thread cancel];
[object release];


这似乎工作正常。但是,当我查看泄漏工具时,我发现一些神秘的泄漏没有从我的代码(空的NSArray)中消失。当我查看malloc的历史记录时,我看到NSArray是通过“ willChangeValueForKey”方法分配的,该方法最终从我的[object dealloc]调用。它恰好将委托设置为nil。正在观察该委托(因此willChangeValueForKey?)。从[NSThread出口]调用[对象解除分配]。

我的猜测是,这是因为[thread cancel]不会立即降低线程的速度(毕竟它处于不同的线程中)。然后我们在主线程上释放对象。
这将其keepCount保留为1。然后,当NSThread实际上降速运行时,它将释放对象。看来这导致了泄漏。我尝试了此快速更改以验证我的假设:

[thread cancel];

[NSThread sleepForTimeInterval:1];
// This makes it wait until the thread releases [object]

[object release];


问题:为什么让NSThread释放对象不安全?它与观察者代码在dealloc中不安全有关吗?

最佳答案

您的主线程应该能够立即[object release],而不必等到取消线程甚至启动线程。 initWithTarget:隐式保留object,而cancel隐式释放它。

您不必在主线程上保留object即可为分离线程的缘故使其保持活动状态。

关于objective-c - NSThread内存泄漏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14886410/

10-09 16:15