NSThread内存泄漏

时间:2013-02-15 00:15:04

标签: objective-c cocoa nsthread

我正在使用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?)。 [object dealloc]从[NSThread出口]调用。

我的猜测是因为[线程取消]不会立即关闭线程(毕竟它在一个不同的线程中)。然后我们在主线程上释放对象。 这使得retainCount保持为1.然后NSThread会在实际旋转时释放对象。看来这会导致泄漏。我尝试了这个快速更改以验证我的假设:

[thread cancel];

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

[object release];

问题:为什么让NSThread取消分配我的对象是不安全的?是否与dealloc中不安全的观察者代码有关?

1 个答案:

答案 0 :(得分:1)

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

您不必在主线程上保留object,以便为分离线程保持活动状态。