关于RunLoop
顾名思义:运行循环,在程序运行中循环做一些事情。
应用范畴:定时器(Timer
),performSelector
,GCD Async Main Queue
,事件响应,手势识别,界面刷新,网络请求,AutoreleasePool
基本作用:保持程序的持续运行,处理App
中的各种事件(比如触摸事件,定时器事件等),节省CPU
资源,提高程序性能(该做事时做事,该休息时休息)


图二相比图一,这都是RunLoop
的作用,说明在UIApplicationMain的方法中已经嵌入了RunLoop
RunLoop的伪代码:

iOS
中有两套API
来访问和使用RunLoop
:
1.Foundation
:NSRunLoop
;
2.Core Foundation
:CFRunLoopRef
。
两者都表示RunLoop
对象,NSRunLoop
是基于CFRunLoopRef
的一层OC
封装
获取RunLoop
对象:
Foundation
:[NSRunLoop currentRunLoop]
,[NSRunLoop mainRunLoop]
Core Foundation
:CFRunLoopGetCurrent()
,CFRunLoopGetMain()
RunLoop
相关的类(Core Foundation
中关于RunLoop
的五个类):
CFRunLoopRef
,CFRunLoopModeRef
,CFRunLoopSourceRef
(事件源),CFRunLoopTimerRef
(计时器),CFRunLoopObserverRef



source0
: 指的是非基于端口por,说白了也就是处理触摸事件,selector
事件
source1
:基于端口的port
,是处理系统的一些事件
timers
:定时器,NSTimer
observers
:监听器,监听RunLoop
的运行状态,可以监听的时间有即将进入Loop
,即将处理Timer
,即将处理Source
,即将进入休眠,刚从休眠中唤醒,即将退出Loop
一个RunLoop
包含若干个Mode
,每个Mode又包含若干个Source0/Source1/Timer/Observer
。RunLoop
启动时只能选择其中一个Mode
,作为currentMode
。如果需要切换Mode
,只能退出当前Loop
,再重新选择一个Mode
进入。不同组的Source0/Source1/Timer/Observer
能分隔开来,互不影响。如果Mode
里没有任何Source0/Source1/Timer/Observer
,RunLoop
会立马退出。
目前已知的Mode有五种:
1.kCFRunLoopDefaultMode
:App的默认Mode,通常主线程在这个Mode下运行
2.UITrackingRunLoopMode
:界面跟踪Mode,用于ScrollView追踪触摸滑动,保证界面滑动时不受其他Mode影响
3.UIInitializationRunLoopMode
:在刚启动App时进入的第一个Mode,启动完成后不再使用
4.GSEventReceiveRunLoopMode
:接收系统事件的内部Mode,通常用不到
5.kCFRunLoopCommonModes
:这是一个占位用的Mode,不是一种真正的Mode
RunLoop与线程:
RunLoop和线程:每条线程都有唯一的一个与之对应的RunLoop对象,RunLoop保存在全局的字典中,线程作为key
,RunLoop作为value
,线程刚创建的时候并没有RunLoop对象,RunLoop会在第一次获取的时候创建,RunLoop会在线程结束时销毁。
RunLoop的运行逻辑:

本文结束。