RunLoop的基本作用
1、保持程序的持续运行
2、处理APP中的各种事件(比如触摸事件、定时器事件等)
3、节省CPU资源,提高程序性能;该做事时做事,该休息时休息
RunLoop与线程之间的关系
每一条线程都有唯一的一个与之对应的RunLoop对象
Runloop保存在一个全局的Dictionary,线程作为key,Runloop作为value
线程刚创建时没有RunLoop对象,RunLoop会在第一次获取时创建, [NSRunloop currentRunloop]
RunLoop会在线程结束时销毁
自线程的RunLoop已经自动获取(创建),子线程默认没有开启RunLoop
RunLoop的运行逻辑
Source0:触摸事件处理、performSelector:onThread
Source1:基于Port的线程间通信、系统事件的捕捉
Timer:NSTimer、performSelector:withObject:afterDelay
Observers:用于监听RunLoop的状态、UI刷新(BeforeWaiting,即runloop即将进入休眠时)、AutoreleasePool
运行流程
RunLoop休眠的实现原理
CFRunLoopModeRef
CFRunLoopModeRef代表RunLoop的运行模式
一个RunLoop包含若干个Mode, 每个Mode又包含若干个Source0,Source1,Timer,Observe
RunLoop启动时只能选择其中一种Mode,作为currentMode
如果需要切换Mode,只能退出当前Loop,再重新选择一种Mode进入