我正在使用 NSThread 如下
NSThread * thread = [[NSThread alloc] initWithTarget:object selector:@selector(bg) object:nil];
[thread start];
稍后我想停止线程并释放对象,如下所示:
[thread cancel];
[object release];
这似乎工作正常。但是,当我查看泄漏工具时,我看到一些神秘的泄漏不是来自我的代码的任何地方(一个空的 NSArray)。当我查看 malloc 历史记录时,我看到 NSArray 是在“willChangeValueForKey”方法中分配的,该方法最终从我的 [object dealloc] 调用。它恰好将委托设置为零。该委托正在被观察(因此 willChangeValueForKey?)。[object dealloc] 从 [NSThread exit] 调用。
我的猜测是,这是因为 [thread cancel] 没有立即停止线程(毕竟它在不同的线程中)。然后我们在主线程上释放对象。这使得它的 retainCount 为 1。然后 NSThread 将在它真正减速时释放对象。看来这会导致泄漏。我尝试了这个快速更改来验证我的假设:
[thread cancel];
[NSThread sleepForTimeInterval:1];
// This makes it wait until the thread releases [object]
[object release];
问题:为什么让 NSThread 释放我的对象是不安全的?它是否与观察者代码在 dealloc 中不安全有关?