我正在使用一个线程在我的应用程序中更新后台消息。该线程在我的消息类中启动。
Messages.m
timerThread = [[NSThread alloc] initWithTarget:self
selector:@selector(startTimerThread:) object:nil];
[timerThread start];
现在我希望线程在用户注销应用程序时停止。对于注销方法(在另一个类中),我添加了
Messages *msg=[[Messages alloc]init];
[msg.timerThread cancel];
[msg release];
但即使在退出应用程序后,线程仍在运行。
答案 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];