0

我正在使用 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 中不安全有关?

4

1 回答 1

1

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

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

于 2013-02-15T00:49:02.920 回答