• NSTimer是一个计时器对象,方法调用在对未来的选择对象。
  • NSThread是一个线程类。 也就是创建一个线程。
  • NSTask类是一个过程,一种方式运行程序从您的其他程序。
  • NSOperation是一个非常漂亮的抽象的任务。 在这个类中嵌入您的操作,你可以很容易地通过一个NSOperationQueue执行类的手段同时进行。
  • NSRunLoop其实NSRunLoop的本质是一个消息机制的处理模式。在某种意义上摘要和适应的选择()的Unix系统调用,管理和调度输入源事件和线程计时器。

每个程序运行在至少一个线程 。 你能想到的每一个单独的进程中的程序执行的线程,每个其他平行进行。

如果你有一些港口样的用户界面,或其他代码,需要听取网络事件,你需要一个运行循环 。 每个NSThread自动都有自己的运行循环,你很少有直接关心他们自己。 在运行循环也创造和释放autorelease池负责。

[查看更多关于autorelease池的讨论意见。 最重要的一点要记住的是,新的线程必须考虑设立一个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:

定时器也处理运行循环。 相反运行循环,你可能经常会使用你的程序定时器直接。 建立一个最简单的方法是非常计时器:

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

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

一个NSTask用于运行一个又一个计划,目前一子的。 这有点类似于一个独立的线程开始,但是如果子崩溃,您的主要程序将继续运行。 程序之间的通信也很不同从多个线程之间的通信在同一进程中。

你用“iPhone”你的问题,并在iPhone你将永远不会使用NSTasks。

NSOperations是用来当您需要处理不同的任务量较大,他们把队列和/或处理他们在单独的线程(虽然他们没有单独的线程中运行)。 如果您的应用程序需要创建只是少数人,专门线程,则没有理由使用NSOperation类。 但是,如果你会经常产生想与服务器通信任务()必须保持记录,NSOperation和NSOperationQueue能派上用场。

NSRunLoop首先是Run Loop的部分概念,它的作用就是循环、处理事件。具体来说有两个方面: 1. 定时启动任务(一般用和Timer协作);2. 处理事件。
在 单线程的app中,不需要注意Run Loop,但不代表没有。程序启动时,系统已经在主线程中加入了Run Loop。它保证了我们的主线程在运行起来后,就处于一种“等待”的状态(而不像一些命令行程序一样运行一次就结束了),这个时候如果有接收到的事件 (Timer的定时到了或是其他线程的消息),就会执行任务,否则就处于休眠状态。

如果我们要写多线程的程序,可能就需要自己来管理Run Loop。
下面说一下楼主提出的方法中的参数:
RunMode: NSDefaultRunLoopMode,可以把这个理解为一个”过滤器“,我们可以只对自己关心的事件进行监视。一般NSDefaultRunLoopMode是最常用的。

启动run loop的方法就是lz写的这个,它的说明如下:
Runs the loop once, blocking for input in the specified mode until a given date.
启动run loop一次,在特定的run loop mode下等待输入。

如果没有附加input source或是timer,或是过limitDate,run loop就会退出,并且方法返回NO。

下来是Run Loop的使用场合:
1. 使用port或是自定义的input source来和其他线程进行通信
2. 在线程(非主线程)中使用timer
3. 使用 performSelector...系列(如performSelectorOnThread, ...)
4. 使用线程执行周期性工作

run loop不需要创建,在线程中只需要调用[NSRunLoop currentRunLoop]就可以得到
假设我们想要等待某个异步方法的回调。比如connection。如果我们的线程中没有启动run loop,是不会有效果的(因为线程已经运行完毕,正常退出了)。

 
 

NSTimer、 NSTask、 NSThread 和 NSRunloop 之间的区别的更多相关文章

  1. NSThread 、NSRunLoop 和 Dispatch Queue

     iOS多线程编程中,NSOperation和NSOperationQueue无疑是最常用的,它们能满足绝大部分情况下的线程操作.但在完成一些特殊的任务时,我们还是要使用的NSThread和NSRun ...

  2. select、poll、epoll之间的区别总结

    select.poll.epoll之间的区别总结 05/05. 2014 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪 ...

  3. 你真的会玩SQL吗?EXISTS和IN之间的区别

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  4. [转]ExtJs基础--Html DOM、Ext Element及Component三者之间的区别

    要学习及应用好Ext框架,必须需要理解Html DOM.Ext Element及Component三者之间的区别. 每一个HTML页面都有一个层次分明的DOM树模型,浏览器中的所有内容都有相应的DOM ...

  5. iOS中assign,copy,retain之间的区别以及weak和strong的区别

    @property (nonatomic, assign) NSString *title; 什么是assign,copy,retain之间的区别? assign: 简单赋值,不更改索引计数(Refe ...

  6. javascrip中parentNode和offsetParent之间的区别

    首先是 parentNode 属性,这个属性好理解,就是在 DOM 层次结构定义的上下级关系,如果元素A包含元素B,那么元素B就可以通过 parentElement 属性来获取元素A. 要明白 off ...

  7. 面试问题5:const 与 define 宏定义之间的区别

    问题描述:const 与 define 宏定义之间的区别 (1) 编译器处理方式不同     define宏是在预处理阶段展开:     const常量是编译运行阶段使用: (2) 类型和安全检查不同 ...

  8. 关于背景图相对父容器垂直居中问题 —— vertical-align 和 line-height 之间的区别

       html css <div class="register-wrapper"> <div class="register"> &l ...

  9. 转:WCF、WebAPI、WCFREST、WebService之间的区别

    WCF.WebAPI.WCFREST.WebService之间的区别   注明:转载 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API ...

随机推荐

  1. Android ScrollView+ViewPager+PullToRefreshListView

    想达到此界面的风格 然后ViewPage里面第一个Fragment是一个瀑布流 这个瀑布流要有加载跟多 在ScrollView中,嵌套ViewPager,在ViewPager的每页使用Fragment ...

  2. mmap

    http://www.360doc.com/content/11/0830/10/1964482_144428042.shtml

  3. WCF异步

    WCF异步与否由客户端来决定 服务端接口: // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”.    [ServiceContract]   ...

  4. Cookie设置HttpOnly,Secure,Expire属性

    在eclipese中创建Web工程时,有个dynamic web module version选项,首先解释下这个选项的意思: http://stackoverflow.com/questions/3 ...

  5. POJ 3204 Ikki's Story I-Road Reconstruction (网络流关键边)

    [题意]给定一个N个节点M条边的网络流,求有多少条边,使得当增其中加任何一个边的容量后,整个网络的流将增加. 挺好的一道题,考察对网络流和增广路的理解. [思路] 首先关键边一定是满流边.那么对于一个 ...

  6. Highcharts20151130

    $(function () { $('#container').highcharts({ chart: { type: 'spline' // 图的类型 }, title: { text: null ...

  7. 【转】DBCP连接池原理分析

    ---------------------------- 目前 DBCP 有两个版本分别是 1.3 和 1.4. DBCP 1.3 版本需要运行于 JDK 1.4-1.5 ,支持 JDBC 3. DB ...

  8. MVC三个IOC注入点之Ninject使用示例

    群里一个技术大牛说MVC有三个注入点,但我只会一个DefaultControllerFactory. 在群友的帮助下,我大致了解了下: IControllerFactory=>IDependen ...

  9. android中常用的弹出提示框

    转自:http://blog.csdn.net/centralperk/article/details/7493731 我们在平时做开发的时候,免不了会用到各种各样的对话框,相信有过其他平台开发经验的 ...

  10. JSON--List集合转换成JSON对象

    转自:http://www.cnblogs.com/xmaomao/p/3184542.html 1. 简单的手动放置 键值对 到JSONObject,然后在put到JSONArray对象里 List ...