RunLoop
运行循环,在程序运行过程中循环做一些事情
用伪代码来表示的话,就是一个do while死循环,大概如下
int retVal = 0;
do {
// 睡眠等待消息
int message = sleep_and_wait();
// 处理消息
retVal = process_message(message);
} while (0 == reValue)
直接窥探RunLoop源码,找到CFRunLoop文件,这里说明一下NSRunLoop和CFRunLoopRef的区分
- NSRunLoop是oc的封装,CFRunLoopRef是c的封装,它们都可以来访问和使用runloop
- NSRunLoop是基于CFRunLoopRef的一层OC包装
继续看源码,我们找到CFRunLoop的定义如下
CFRunLoop的定义源码主要看图中红框的部分,可以得出以下结论
- 一个RunLoop包含一个线程,一一对应关系
- 一个RunLoop多种mode(模式),但当前模式只能是其中一中
模式究竟是什么?可以继续窥探它的源码
CFRunLoopMode的定义源码代码可能有点抽象,把它们画成图大概如下
RunLoop结构图那么它究竟是怎么运作的呢?首先我们要来了解下mode,在RunLoop中有多重mode,开发用到的主要是以下几个
- kCFRunLoopDefaultMode:默认模式,一般主线程在这个模式下运行
- UITrackingRunLoopMode : 界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响
- kCFRunLoopCommonModes:公用模式,比如你的代码想在UITrackingRunLoopMode和kCFRunLoopDefaultMode模式下都运行,那么就可以选择common mode
主要还是看红框部分,他们的介绍如下
- name:模式名称
- sources0:处理一些普通的代码
- 触摸事件处理
- performSelector:withObject: - sources1:处理一些普通的代码
- 基于Port的线程间通信
- 系统事件捕捉 - timers:处理定时器
- NSTimer
- performSelector:withObject:afterDelay - observers:处理通知
- 用于监听Runloop的状态
- UI刷新(BeforeWaiting)
- autoRelease pool
说到这里,可能会有疑问,这些东西究竟是干什么的,有什么用呢?
网友评论