如何停止nsthread

时间:2011-03-04 11:22:20

标签: iphone nsthread

我正在使用一个线程在我的应用程序中更新后台消息。该线程在我的消息类中启动。

Messages.m

timerThread = [[NSThread alloc] initWithTarget:self
                selector:@selector(startTimerThread:) object:nil]; 
[timerThread start];

现在我希望线程在用户注销应用程序时停止。对于注销方法(在另一个类中),我添加了

Messages *msg=[[Messages alloc]init];  
[msg.timerThread cancel];  
[msg release];  

但即使在退出应用程序后,线程仍在运行。

4 个答案:

答案 0 :(得分:4)

[timerThread cancel]不会停止线程,只是将其标记为已取消。我假设你的startTimerThread:执行某种无限循环。你必须定期检查这个循环中的isCancelled,如果是,你应该执行一些清理并从这个循环中断。

顺便说一句,如果你不经常执行更新,在主线程中运行NSTimer并在回调上分离新线程(如[self performSelectorInBackground:@selector(updateMessages:) withObject:whatever])或启动NSOperation的实例会更方便

答案 1 :(得分:2)

(我假设你在程序的其他地方创建了一个消息实例)

根据您提供的代码,您将在注销过程中创建一个新的Messages实例(启动一个新线程),取消该新线程(-cancel是一种停止线程的正确方法 - 如果你的线程方法遵循文档中列出的注意事项,那么释放你的(额外?)消息实例。此时,您的原始Messages实例仍然存在,并且该线程仍在运行。

如果您希望在释放类的实例时停止线程,您可能应该在消息的-dealloc方法中处理它,并确保在适当的时间释放原始的Messages实例。

答案 2 :(得分:1)

[NSThread exit];

你检查过这个NSThread类的方法。

答案 3 :(得分:0)

使用[NSThread exit];[NSThread cancel];