我正在使用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中不安全的观察者代码有关?
答案 0 :(得分:1)
您的主线程应该能够立即[object release]
,您不必等到取消线程,或者甚至直到您启动它。 initWithTarget:
隐式保留object
,cancel
隐式释放它。
您不必在主线程上保留object
,以便为分离线程保持活动状态。