Runloop是通过内部维护的事件循环来对事件/消息进行管理的一个对象
这里有两个重点: 事件循环 事件/消息进行管理
- 什么是事件循环呢?
- 事件循环(状态切换)
- 没有消息需要处理时,休眠以避免资源占用
- 用户态——>内核态
-
- 有消息需要处理时,立刻被唤醒
- 用户态<—— 内核态
RunLoop 通过 mach_msg()函数接收、发送消息来进行管理。它的本质是调用函数 mach_msg_trap(),相当于是一个系统调用,会触发内核状态切换。
可以做到在有事做的时候做事,没事做的时候,会由用户态切换到内核态,避免资源浪费。
mach_msg() 函数实际上是调用了一个 Mach 陷阱 (trap),
即函数mach_msg_trap(),陷阱这个概念在 Mach 中等同于系统调用。
当你在用户态调用 mach_msg_trap() 时会触发陷阱机制,切换到内核态;
内核态中内核实现的 mach_msg() 函数会完成实际的工作,

所以说 Runloop的核心就是一个 mach_msg(),RunLoop 调用这个函数去接收消息,如果没有别人发送 port 消息过来,内核会将线程置于等待状态。例如你在模拟器里跑起一个 iOS 的 App,然后在 App 静止时点击暂停,你会看到主线程调用栈是停留在 mach_msg_trap() 这个地方。