1.什么是 Runloop
本质是一个 oc 对象,内部也存在 isa 指针。
2.Runloop 和线程什么关系
线程与 Runloop 之间是 key-value 关系,保存在全局的 Dictionary 内,线程是 key,runloop 是value,而且是懒加载的。
3.Runloop的底层数据结构是什么样的?有几种运行模式(mode)?每个运行模式下面的 CFRunloopMode 是哪些?他们分别是什么职责?
Runloop 的数据结构:
`CFRunLoop`,RunLoop对象
`Mode`,运行模式
`Source`,输入源/事件源
`Timer`,定时源
`Observer`,观察者
系统默认注册了5个Mode
常用的有3个:
`Default` : App的默认Mode,通常主线程是在这个Mode下运行
`UITracking: 界面跟踪Mode,用于`ScrollView`追踪触摸滑动,保证界面滑动时不受其他Mode影响。
`Common` :并不是一个真的模式,它只是一个标记,如:被标记的 `Timer`可以在`Default模式和UITracking`下运行。
基本用不到的Mode:
`UIInitialization` :私有的mode,App启动的时候的状态,加载出第一个页面后,就转成了Default
`GSEventReceive`系统的内部 Mode,通常用不到
4.Runloop 的监听状态有哪几种?
Entry -> BeforeTimers -> BeforeSource s-> BeforeWaiting(休眠) -> AfterWaiting(唤醒) -> Exit -> AllActivities
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
kCFRunLoopEntry = (1UL << 0), // 即将进入Loop
kCFRunLoopBeforeTimers = (1UL << 1), // 即将处理Timer
kCFRunLoopBeforeSources = (1UL << 2), // 即将处理Source
kCFRunLoopBeforeWaiting = (1UL << 5), // 即将进入休眠
kCFRunLoopAfterWaiting = (1UL << 6), // 刚从休眠中唤醒
kCFRunLoopExit = (1UL << 7), // 即将退出Loop
kCFRunLoopAllActivities = 0x0FFFFFFFU // 所有状态
};
5.Runloop 的工作流程大概是什么样的?
6.Runloop 有哪些应用?
滑动scrollview时候的mode切换
cell的图片下载将多个耗时操作分开执行
在每次 RunLoop 唤醒时去做一个耗时任务。
7.Runloop的内核态和用户态?
- CPU的两种工作状态:内核态和用户态(或者称管态和目态)
- 内核态:系统中既有操作系统的程序,也由普通用户的程序。为了安全和稳定性操作系统的程序不能随便访问,这就是内核态,内核态可以使用所有的硬件资源。
- 用户态:不能直接使用系统资源,也不能改变CPU的工作状态,并且只能访问这个用户程序自己的存储空间。