自毁毁NSThread是否安全?

时间:2010-08-23 16:09:25

标签: iphone multithreading cocoa nsthread

我有一个非常标准的设置。我有一个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。任何人都可以提供任何见解吗?

0 个答案:

没有答案