iphone – NSTimer,NSTask,NSThread和NSRunloop的基本区别是什么?

iphone – NSTimer,NSTask,NSThread和NSRunloop的基本区别是什么?,第1张

概述NSTimer,NSTask,NSThread和NSRunloop有什么区别,是否有什么时候使用它们的指南? 每个程序至少在一个线程中运行。您可以将每个线程视为程序执行的单独进程,每个进程与其他进程并行运行。 如果你有某种用户界面或其他需要监听事件(如网络端口)的代码,你需要一个运行循环。每个NSThread都自动获得自己的运行循环,你很少需要直接关心自己。运行循环还负责创建和释放自动释放池。 [ NSTimer,NSTask,NSThread和NSRunloop有什么区别,是否有什么时候使用它们的指南?解决方法 每个程序至少在一个线程中运行。您可以将每个线程视为程序执行的单独进程,每个进程与其他进程并行运行。

如果你有某种用户界面或其他需要监听事件(如网络端口)的代码,你需要一个运行循环。每个NSThread都自动获得自己的运行循环,你很少需要直接关心自己。运行循环还负责创建和释放自动释放池。

[编辑:查看评论有关autorelease池的更多讨论。要记住的最重要的一点是,新线程必须注意设置一个自动释放池。例如,使用detachNewThreadSelector(见下文)调用的方法应该有以下作为它们的第一行和最后一行:

NSautoreleasePool *pool = [ [ NSautoreleasePool alloc ] init ];   [code here]   [pool release];

这同样适用于使用其他技术生成的线程。

在主线程中,所有的UI处理都发生,运行循环是非常重要的,因为它保持接口无效。这就是为什么你不应该运行在主线程上消耗时间的代码:它将在线程上的所有时间,并且运行循环将不允许运行足够频繁,导致锁定或缓慢的接口。如果需要执行耗时的计算,或保持任务在后台运行,则应创建一个新线程。同样,你可能不需要考虑创建的新的运行循环。在新线程中执行方法的简单方法:

[NSThread detachNewThreadSelector:@selector(theSelector) toTarget:self withObject:nil];

线程间通信可能很棘手,你应该知道方法performSelector:onThread:withObject:waitUntilDone:和performSelectorOnMainThread:withObject:waitUntilDone:
(关于通过线程发送NSNotifications的很好的提示here.)

计时器也由运行循环处理。与运行循环相反,您可能经常在程序中直接使用定时器。创建计时器的最简单的方法是:

[self performSelector:@selector(aSelector) withObject:nil afterDelay:1.0];

但有时你想自己创建和管理NSTimer对象,例如,能够取消和重新使用一个计时器。

NSTask用于运行另一个程序作为当前子进程的子进程。它有点类似于启动一个单独的线程,但如果一个子进程崩溃,你的主程序将继续运行。程序之间的通信也与同一进程中多个线程之间的通信非常不同。

你用“iphone”标记你的问题,在iPhone上你永远不会使用NSTasks。

当您需要处理更大量的不同任务,将它们放置在队列中和/或在单独的线程中处理它们时,使用NSOperations(虽然它们不必在单独的线程中运行)。如果你的应用程序需要创建几个,专门的线程,那么没有理由使用NSOperation类。但是,如果你将常规生成必须跟踪的任务(如与服务器通信),NSOperation和NSOperationQueue将派上用场。

总结

以上是内存溢出为你收集整理的iphone – NSTimer,NSTask,NSThread和NSRunloop的基本区别是什么?全部内容,希望文章能够帮你解决iphone – NSTimer,NSTask,NSThread和NSRunloop的基本区别是什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1042563.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存