NStimer,runloop,thread,task小总结

转载 2012年03月28日 19:40:12

·  NSThread:常见的线程

每个进程里都有多个线程,我们一般如下实用thread:

  1. [NSThread detachNewThreadSelector:@selector(myThreadMainMethod:) toTarget:self withObject:nil];  

如果函数需要输入参数,那么可以从object传进去。你也可以这样实现

  1. NSThread* myThread [[NSThread alloc] initWithTarget:self selector:@selector(myThreadMainMethod:) object:nil];  
  2.  [myThread start]; // Actually create the thread  
  3. (from apple: threading PG)  

你的对象也可以直接使用线程:

  1. [myObj performSelectorInBackground:@selector(doSomething) withObject:nil];  


 

 

·      NSTimer:定时器

等待一定时间后,触发某个事件发生,可循环触发。默认是添加到当前runloop。你也可以添加到自己新建的runloop里去,注意如果添加的话runloop会retain timer,你应当release timer而将timer交给runloop,就像将operation加入operationQueue中一样。

可以很简单的调用:

  1.     [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(addLabel) userInfo:nil repeats:YES];  
  2. (void)addLabel  
  3.  
  4.     label.text [NSString stringWithFormat:@"%d",num++];  
  5.  


每隔2秒,就触发定时器,向self发送addLabel消息。



·       NSRunLoop

当有输入信号(input source,比如键盘鼠标的操作、),NSPort和NSConnection对象时,runloop提供了一个程序接口,即等待输入。但是我们从来都不需要去创建或者去管理一个runloop。在每个进程中都相应的有runloop,不管时当前的主进程还是你新建的进程。如果需要访问当前进程的runloop可以调用类方法:

  1. (NSRunLoop *)currentRunLoop。  
  2. [[NSRunLoop currentRunLoop] performSelector:@selector(addLabel2)  
  3.                                          target:self   
  4.                                        argument:nil   
  5.                                           order:0   
  6.                                          modes:[NSArray arrayWithObjects:@"NSDefaultRunLoopMode",n il]]  


 //举个例子而已,一般不会这样用

一般需要使用runloop也就是对于netservice,stream等对象以某种模式schedule在当前的runloop,如:

  1. [[_session inputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];。  


Runloop的作用在于当有事情要做时它使当前的thread工作,没有事情做时又使thread 休眠sleep。注意Runloop并不是由系统自动控制的,尤其是对那些你新建的次线程你需要对其进行显示的控制。

 

Runloop顾名思义就是一个不停的循环,不断的去check输入,如下图。

我们需要了解runloop modes这对判断事件来源以及添加到runloop时很有必要。

正如之前我们所说,只有创建了次线程才需要我们管理runloop,但是也并不是创建了次线程就一定需要管理runloop,仅当:

  Use ports or custom input sources to communicate with other threads.

  Use timers on the thread.

  Use any of the performSelector... methods in a Cocoa application.

  Keep the thread around to perform periodic tasks.

你还可以注册runloop,这样可以使用kvo。

 

·       NSTask:

使用task你可以运行其它程序作为当前程序的子进程,并监控它的运行。它和线程的不同之处在于它并不何创建它的进程(父进程)共享内存。可以说是“完全”独立的一个东西。

 

 

更多知识参考:http://wenku.baidu.com/view/75c7e5bbc77da26925c5b000.html

相关文章推荐

iphone ios NStimer,runloop,thread,task小总结

原文:http://www.cnblogs.com/scorpiozj/archive/2011/01/25/1944498.html 对这几个也算不上有很深的理解,只是平时用到些许timer,th...

timer,runloop,thread,task小总结(转)

对这几个也算不上有很深的理解,只是平时用到些许timer,thread。 想起有次去baidu笔试遇到runloop和timer等的区别,当时就不会。 两三月过去了,如今终于稍微整理了下。 有不...
  • wwmusic
  • wwmusic
  • 2013年05月29日 14:57
  • 638

NSTimer详解----使用、保留环问题、与runloop的关系

一、使用NSTimer你需要了解的内容 (1)只有将计时器放在运行循环中,它才能正常的触发任务。 (2)NSTimer对象会保留target,直到计时器失效,调用invalidate可令其失效;一...

(iOS开发) RunLoop与NSTimer的相关

在开发中经常会遇到这种情况,自己开启了个定时器,但是在某些情况下的时候,timer的方法不响应,但是timer仍然开启着;这种情况就是timer所在的Runloop暂时关闭了。 一、RunLoop...

在子线程中使用runloop,正确操作NSTimer计时的注意点 三种可选方法

这篇文章是我的【iOS开发每日小笔记】系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧。它们可能会给用户体验、代码效率得到一些提升,或是之前自己...

将NSTimer添加至RunLoop中的两种方法区别

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)l...

NSTimer与RunLoop的具体问题分析

我想说你知道NSTimer会retain你添加调用方法的对象吗?你知道NSTimer是要加到runloop中才会起作用吗?你知道NSTimer会并不是准确的按照你指定的时间触发的吗?你知道NSTime...

将NSTimer增添至RunLoop中的两种方法区别

转载自点击打开链接 将NSTimer添加至RunLoop中的两种方法区别 - (BOOL)application:(UIApplication *)application didFinishL...

NSTimer的两种创建方式以及跟RunLoop的简单结合使用

NSTimer 有两种常用创建方式。 第一种: NSTimer *timer = [NSTimer timerWithTimeInterval:1 target:self selector:@se...

iphone——Thread,RunLoop初识

转自http://blog.csdn.net/lingedeng/article/details/6863866 每个程序至少运行于一个thread中(称为main thread),...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NStimer,runloop,thread,task小总结
举报原因:
原因补充:

(最多只允许输入30个字)