• 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. 利用CCProxy管理小型企业的上网行为

    本实验以实例方式,从操作条件.背景.需求.以及具体要求的几个部分进行说明. 1. 操作条件: 装有Windows Server 2003系统,安装了代理服务程序的虚拟机一台 2. 背景: 为了提高员工 ...

  2. sqlmap批量扫描burpsuite请求日志记录

    sqlmap可以批量扫描包含有request的日志文件,而request日志文件可以通过burpsuite来获取, 因此通过sqlmap结合burpsuite工具,可以更加高效的对应用程序是否存在SQ ...

  3. IE/Firefox每次刷新时自动检查网页更新,无需手动清空缓存的设置方法

    浏览器都有自己的 缓存机制,一般CSS和图片都会被缓存在本地,这样我们修改的CSS就看不到效果 了,每次都去清空缓存,再刷新看效果,这样操作太麻烦了.在IE下我们可以直接 去修改internet选项/ ...

  4. 学习笔记-[Maven实战]-第三章:Maven使用入门(3)

    这里说一下在建测试工程里遇到的问题 1.第一次建工程,junit依赖始终没有成功,最后删除现在工程,新建了一个工程就好了 2.使用junit4的问题.工程默认的依赖是junit3.8.1,我改成了4. ...

  5. Windows使用virtualenv搭建flask开发环境

    virtualenv: VirtualEnv用于在一台机器上创建多个独立的Python虚拟运行环境,多个Python环境相互独立,互不影响,它能够: 在没有权限的情况下安装新套件 不同应用可以使用不同 ...

  6. poj 3026 Borg Maze (最小生成树+bfs)

    有几个错误,调试了几个小时,样例过后 1Y. 题目:http://poj.org/problem?id=3026 题意:就是让求A们和S的最小生成树 先用bfs找每两点的距离,再建树.没剪枝 63MS ...

  7. @深入注解,在Java中设计和使用自己的注解

    我们用过 JDK给我们提供的  @Override  @Deprecated @SuppressWarning 注解  ,这些注解是JDK给我们提供的 ,我们只是在用别人写好的东西 ,那么我们是否可以 ...

  8. poj2823

    这是一道题意简单,数据较大的题(喜闻乐见): 一开始可能会想到RMQ问题,ST,线段树都是O(nlogn),应该勉强能过(没试过): 由于这道题区间是滚动连续的,所以,可以使用单调队列! 以最小值为例 ...

  9. UVa 1605 (构造) Building for UN

    题意: 有n个国家,要设计一栋长方体的大楼,使得每个单位方格都属于其中一个国家,而且每个国家都要和其他国家相邻. 分析: 紫书上有一种很巧妙的构造方法: 一共有2层,每层n×n.一层是每行一个国家,另 ...

  10. bzoj2818gcd

    原理很简单 题解我就不自己写了…… 做这题的时候,懂得了一个非常重要的转化:求(x, y) = k, 1 <= x, y <= n的对数等于求(x, y) = 1, 1 <= x, ...