2011-08-25 94 views
3

如何从主线程中销毁由performSelectorInBackground:withObject:创建的线程?我需要强制终止冻结线程。如何终止performSelectorInBackground:线程?

+0

你怎么知道它是“冻结的”,而不仅仅是非常非常非常长的时间来执行? (如果你可以成功地回答这个问题,你将解决所有时间最大的问题之一) –

回答

9

你不能从后台杀死后台线程ad,在后台线程中执行的方法必须返回以结束线程。

您的实际问题似乎是您的后台线程处于冻结状态,您应该解决该问题,而不是尝试解决该问题。

+0

+1“你的实际问题似乎是你的后台线程冻结了,你应该解决这个问题,而不是试图解决它。” – justin

+0

那么一旦你希望它停止,你只需要在你的背景方法中做一个回报? – Supertecnoboff

1

我不知道这是否可以帮助,但这里有云:

假设你打电话,从A类并假设A类performSelector通话将被从内存在B级释放(其如果是选择尚未执行的地方,你可能会得到一个崩溃 - 所以你在SO)发布了这个问题:

无论你的B释放,这样做:

[NSObject cancelPreviousPerformRequestsWithTarget:A]; 
+0

我也从'performSelectorInBackground'线程全新的'performSelectorOnMainThread'。 – Dmitry

+1

这有助于计划延迟执行的方法,但不适用于已在运行的方法。 – omz

0

苹果documentation

推荐的方式退出线程让它正常退出其入口点 程序。虽然Cocoa,POSIX和多处理服务 提供了直接消除线程的例程,但是强烈建议不要使用这样的例程 。杀死一个线程可以防止 之后的线程自行清理。由该线程分配的内存可能会被泄漏, 线程当前正在使用的任何其他资源可能无法正确清理,从而在稍后创建潜在问题 。