如何在iphone中停止NSThread子线程

如何在iphone中停止NSThread子线程,iphone,objective-c,nsthread,Iphone,Objective C,Nsthread,我在主线程中使用NSThread创建了一个子线程 NSThread*newThread=[[NSThread alloc]initWithTarget:self-selector:@selector(MyThread:)object:timer] 5秒后,我在主线程中使用[newThread cancel]来停止子线程,但它不起作用 方法MyThread:in newThread仍在工作 那么,停止新线程的正确答案是什么 实际上,[newThread isCancelled]是肯定的,但选择器M

我在主线程中使用NSThread创建了一个子线程

NSThread*newThread=[[NSThread alloc]initWithTarget:self-selector:@selector(MyThread:)object:timer]

5秒后,我在主线程中使用[newThread cancel]来停止子线程,但它不起作用

方法MyThread:in newThread仍在工作

那么,停止新线程的正确答案是什么


实际上,[newThread isCancelled]是肯定的,但选择器MyThread仍在运行

方法
cancel
只通知线程它已被取消(如您所述,将
isCancelled
更改为
YES
。然后由线程本身负责检查并退出。例如,在
MyThread:
方法中,您可以执行以下操作:

// At some checkpoint
if([[NSThread currentThread] isCancelled]) {
    /* do some clean up here */
    [NSThread exit];
}
您应该定期执行此检查,并从线程中退出,如图所示;否则,
取消
不会有任何效果。

-(void)取消

讨论 此方法的语义与用于NSOperation对象的语义相同。此方法在接收器中设置状态信息,然后由isCancelled方法反映。支持取消的线程应定期调用isCancelled方法,以确定线程是否确实已取消,如果已取消,则退出曾经。


更多信息请参见

您的意思是一个线程只能被自身取消,而不能被另一个线程或主线程取消?@None:它的意思是“取消”线程不会按您的想法执行。当您取消一个线程时,它会导致
isCancelled
返回
YES
。然后该线程应该停止执行。不过,它不会强制线程立即停止执行-如果它打开了任何资源,这会很麻烦。@Chuck:谢谢,但是如果我想在main t中停止一个子线程线程,我应该怎么做?实际上,你不能。没有办法知道线程被终止时处于什么状态,因此,除了
isCancelled
机制之外,没有办法从另一个线程安全终止线程。