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() 这个地方。