Runloop

107 阅读2分钟

1.什么是 Runloop

本质是一个 oc 对象,内部也存在 isa 指针。

2.Runloop 和线程什么关系

 线程与 Runloop 之间是 key-value 关系,保存在全局的 Dictionary 内,线程是 key,runloop 是value,而且是懒加载的。

3.Runloop的底层数据结构是什么样的?有几种运行模式(mode)?每个运行模式下面的 CFRunloopMode 是哪些?他们分别是什么职责?

Runloop 的数据结构:
    `CFRunLoop`,RunLoop对象
    `Mode`,运行模式
    `Source`,输入源/事件源
    `Timer`,定时源
    `Observer`,观察者
系统默认注册了5Mode
    常用的有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 的工作流程大概是什么样的?

357f889cbfad4005b4fb6982da1854aa.png

6.Runloop 有哪些应用?

滑动scrollview时候的mode切换
cell的图片下载将多个耗时操作分开执行
在每次 RunLoop 唤醒时去做一个耗时任务。

7.Runloop的内核态和用户态?

 -   CPU的两种工作状态:内核态和用户态(或者称管态和目态)
 -   内核态:系统中既有操作系统的程序,也由普通用户的程序。为了安全和稳定性操作系统的程序不能随便访问,这就是内核态,内核态可以使用所有的硬件资源。
 -   用户态:不能直接使用系统资源,也不能改变CPU的工作状态,并且只能访问这个用户程序自己的存储空间。