什么是 RunLoop
1 - RunLoop 即运行循环:在程序运行中循环做一些事情
2 - RunLoop 应用范围
① 定时器(Timer)、PerformSelector
② GCD Async Main Queue
③ 事件响应、手势识别、界面刷新
④ 网络请求
⑤ AutoreleasePool
3 - RunLoop 基本作用
① 保持程序的持续运行
② 处理App中的各种事件(比如触摸事件、定时器事件等)
③ 节省 CPU 资源,提高程序性能:该做事时做事,该休息时休息
4 - iOS 中有 2 套 API 来访问和使用 RunLoop
① Foundation:NSRunLoop
② Core Foundation:CFRunLoopRef
注:NSRunLoop 和 CFRunLoopRef 都代表着 RunLoop 对象。NSRunLoop 是基于 CFRunLoopRef 的一层 OC 包装(CFRunLoopRef 是开源的)
下载地址:https://opensource.apple.com/tarballs/CF/
5 - RunLoop 和线程的关系
① 每条线程都有唯一的一个与之对应的 RunLoop 对象
② RunLoop 保存在一个全局的 Dictionary 里(线程作为 key,RunLoop 作为 value)
③ 线程刚创建时并没有 RunLoop 对象,RunLoop 会在第一次获取它时创建
④ RunLoop 会在线程结束时销毁
⑤ 主线程的 RunLoop 会自动获取(创建);子线程默认没有开启 RunLoop
6 - 如何获取 RunLoop 对象
1 // Foundation 2 [NSRunLoop currentRunLoop]; // 获得当前线程的RunLoop对象 3 [NSRunLoop mainRunLoop]; // 获得主线程的RunLoop对象 4 5 // Core Foundation 6 CFRunLoopGetCurrent(); // 获得当前线程的RunLoop对象 7 CFRunLoopGetMain(); // 获得主线程的RunLoop对象
7 - Core Foundation 中关于 RunLoop 的五个类
① CFRunLoopModeRef 代表 RunLoop 的运行模式
② 一个 RunLoop 包含若干个 Mode,每个 Mode 又包含若干个 Source0/Source1/Timer/Observer
③ RunLoop 启动时只能选择其中一个 Mode 作为 currentMode
④ 如果需要切换 Mode,只能退出当前 Loop 后再重新选择一个 Mode 进入
⑤ 不同 Mode 中的 Source0/Source1/Timer/Observer 能分隔开来,互不影响;如果 Mode 里没有任何 Source0/Source1/Timer/Observer,RunLoop 会立马退出
注:常见的 2 种 Mode
kCFRunLoopDefaultMode(NSDefaultRunLoopMode):App的默认Mode,通常主线程是在这个 Mode 下运行 UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响RunLoop 的运行逻辑 <CF-CF-1153.18>
1 - 打开 CoreFoundation 源码,找到 CFRunnLoopRun 入口
2 - 源码不再一步步细读,直接上图:RunLoop 运行逻辑大致如下
具体流程图
标签:Foundation,逻辑,CFRunLoopRef,iOS,NSRunLoop,线程,Mode,RunLoop From: https://www.cnblogs.com/self-epoch/p/17232640.html