我正在使用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/