###用runloop解决cpu空转安全
CPU调度线程工做的时候,其中每个线程都是一个runloop。 也就是若是有任务的时候,runloop会让线程执行任务,没有任务时候会让runloop休眠。 换句话说,那什么是一个runloop?一个UI事件,一个timer,一个系统delegate都称之为runloop(不是NSRunloop), runloop其实是从接收消息,而后处理完消息的一个完整过程。runloop使线程进入一个循环。
###runloop运行模式异步
一种Runloop运行模式,就是一个要监控的Input和Timer事件源的集合或者是一个要通知的Runloop观察者的集合。
###了解设置模式oop
NSDefaultRunLoopMode:默认的运行模式,用于大部分操做,除了NSConnection对象事件。 NSConnectionReplyMode:用来监控NSConnection对象的回复的,不多可以用到。 NSModalPanelRunLoopMode:用于标明和Mode Panel相关的事件。 NSEventTrackingRunLoopMode:用于跟踪触摸事件触发的模式(例如UIScrollView上下滚动)。 NSRunLoopCommonModes:是一个模式集合,当绑定一个事件源到这个模式集合的时候就至关于绑定到了集合内的每个模式。 Cocoa应用默认包含Default、Panel、Event Tracking模式,Core Foundation只包含Default模式, 咱们能够经过CFRunLoopAddCommonMode添加模式。
###runloop在哪里线程
主线程的NSRunloop默认自动运行,因此只有第二线程才须要咱们本身运行NSRunloop。 并非全部使用线程的状况都要运行NSRunloop,下面一些状况你须要运行NSRunloop: 须要使用Port或者自定义Input Source与其余线程进行通信。 须要在线程中使用Timer。 须要在线程上使用performSelector*****方法。 须要让线程执行周期性的工做。 NSURLConnection在子线程中发起异步请求。 注意: 基于Cocoa的接口不是线程安全的,基于Core Foundation的接口是线程安全的。
###使用方法code
[NSThread detachNewThreadSelector:@selector(loadPageInBackground:)toTarget:self withObject:nil]; [NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
###换起runloop的三种方式orm
1.NSRunloop 2.runloop 3.AutoreleasePool
###额外了解对象
每个Runloop, 系统会隐式建立一个Autorelease pool,这样全部的release pool会构成一个象CallStack同样的一个栈式结构, 在每个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每一个Object会被release