一、Runloop 简介
Runloop 是通过内部维护事件循环来对事件/消息进行管理的一个对象。
事件循环(状态切换)
- 没有消息需要处理时,休眠以避免资源占用(用户态 -> 内核态)
- 有消息需要处理时,立刻被唤醒(内核态 -> 用户态)
事件/消息管理:Runloop 通过 mach_msg() 函数接收、发送消息来进行管理。

二、Runloop 数据结构
NSRunloop 是 CFRunloop 的封装,提供了面向对象的 API。
typedef struct __CFRunLoopMode *CFRunLoopModeRef;
struct __CFRunLoopMode {
// ...
CFStringRef _name;
// ...
CFMutableSetRef _sources0; // <set>
CFMutableSetRef _sources1; // <set>
CFMutableArrayRef _observers; // <Array>
CFMutableArrayRef _times; // <Array>
// ...
};
// CFRunloop.h 类型重命名
typedef struct __CFRunLoop *CFRunLoopRef;
// CFRunloop.c 结构体
struct __CFRunLoop {
// ...
pthread_t _pthread; // runloop 执行线程(runloop 和线程的关系是一一对应)
// ...
CFMutableSetRef _commonModes; // <set> String UITrackingRunloopMode / KCFRunloopDefaultMode (一个存储了被标记为 common modes 的模式集合)
CFMutableSetRef _commonModeItems; // <set> Timer / Observer / Source
CFRunLoopModeRef _currentMode; // 当前运行的 mode
CFMutableSetRef _modes; // 内置的 modes
// ...
};
Runloop 内部存在一个 modes 集合,但 Runloop 只能运行一个 Mode, Runloop 只会处理它当前 Mode 的事件。

Runloop 运行模式
- kCFRunLoopDefaultMode, App的默认运行模式,通常主线程是在这个运行模式下运行
- UITrackingR

Runloop是iOS中用于管理事件和消息的对象,通过事件循环在无消息时休眠、有消息时唤醒。它包含不同模式如DefaultMode和TrackingMode,处理Source0、Source1、Observer和Timer等事件。Runloop与线程一一对应,内部结构包括sources、observers和modes等。Runloop的工作流程涉及GCD、Observer状态变化通知、Timer触发以及对MainQueue的处理。Runloop在实际应用中涉及AutoreleasePool、事件响应、手势识别、界面更新和按钮点击等场景。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



