我有一个非常标准的设置。我有一个UIViewController来处理用户交互和一个有点长时间运行的NSThread,它在UI控制器出现时执行实际工作。我遇到的一个问题是我想要取消NSThread。标准的NSThread语义没问题。我希望线程完成,自我清理(以便它释放对我的UIViewController的引用),然后弹出UIViewController。所以我的代码看起来像这样:
在NSThread选择器中:
-(void) nsThreadWork
{
// do work here
@synchronized(self)
{
[nsThreadInstance release];
nsThreadInstance = nil;
}
}
在产生线程的UIViewController中:
-(void) startThread
{
nsThreadInstance = [[NSThread alloc] initWithTarget:self
selector:@(nsThreadWork) ...];
[nsThreadInstance start];
[nsThreadInstance release];
}
如果我想取消:
// assume that this will be retried until we can execute this successfully.
-(void) cancelBackgroundOpAndPopViewController
{
@synchronized(self)
{
if (nsThreadInstance == nil)
{
[self popViewController];
}
}
}
我怀疑这是否正确。问题是,UI元素只能从主线程中操作。如果我在NSThread退出之前弹出视图控制器,NSThread将退出并释放视图控制器,这意味着它将从NSThread的上下文中解除分配,这将导致断言。一切似乎与上面的代码一起正常工作,但我不明白runloop何时解除分配NSThread。任何人都可以提供任何见解吗?