iOS 底层 day17 RunLoop 初识

一、初识 RunLoop(整体概念)

1. 什么是 RunLoop?
  • 顾名思义:运行循环
  • 在程序运行过程中循环做一些事情
2. RunLoop 的应用范畴
  • 定时器(NSTimer)、 PerformSelector
  • GCD Async Main Queue
  • 事件响应、手势识别、页面刷新
  • 网络请求
  • AutoReleasePool
3. 没有 RunLoop 会怎么样?
没有 RunLoop 会怎么样?
  • 程序运行完 19 行代码后,会立即退出程序。
4. 有 RunLoop 会怎么样?
有 RunLoop 会怎么样?

二、 RunLoop 的一些基本概念

1. RunLoop 对象
  • iOS 中有 2 套 API 来访问和使用 RunLoop
  • Foundation 框架:NSRunLoop
  • Core Foundation 框架:CFRunLoopRef
  • NSRunLoop 是基于 CFRunLoopRef 的一层 OC 包装
  • CFRunLoopRef 是开源的
  • https://opensource.apple.com/tarballs/CF/
2. RunLoop 和线程的关系
  • 每条线程都有唯一一个与之对应的 RunLoop 对象
  • RunLoop 保存在一个全局的 Dictionary 里面,线程作为 keyRunLoop 作为 value
  • 线程刚刚创建时,并没有 RunLoop 对象,RunLoop 会在第一次获取它时创建
  • RunLoop 会在线程结束时销毁
  • 主线程的 RunLoop 已经自动获取(创建),子线程默认没有开启 RunLoop
3. RunLoop 相关的类
RunLoop 相关的类
4. CFRunLoopModeRef 相关的介绍
  • CFRunLoopModeRel 代表 RunLoop 的运行模式
  • 一个 RunLoop 包含若干个 Mode,每个 Mode 又包含若干个 Source0/Source1/Timer/Observer
  • RunLoop 启动时只能选择其中一个 Mode,作为 currentMode
  • 不同组Source0/Source1/Timer/Observer 能分隔开来,互不影响
  • 如果启动时 Mode 里面没有任何 Source0/Source1/Timer/ObserverRunLoop 会立马退出
5. 常见的两种 mode
  • kCFRunLoopDefaultMode(NSDefaultRunLoopMode):App的默认 Mode,通常主线程就是在这个 Mode 下运行的
  • UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响
  • kCFRunLoopCommonModes:默认包括 kCFRunLoopDefaultModeUITrackingRunLoopMode

三、 代码中查看 RunLoop

1. 查看 touchesBegan:withEvent: 函数调用栈
bt 指令查看函数调用栈详细信息
  • 我们从函数调用栈中看到 source0 的相关信息,这是因为 source0 就是和触摸事件处理相关
2. 思考 CFRunLoopRef runloopRef = CFRunLoopGetMain();NSRunLoop *runloop = [NSRunLoop mainRunLoop]; 的内存地址相同吗?不是说一个线程只有一个 RunLoop 吗?为什么会不相同呢?
打印结果
  • 两种方式获得的 RunLoop 对象内存地址不相同
  • NSRunLoop 是对 CFRunLoopRef 的一种包装,所以内存地址不相同,本质是一样的,我们从图中的红框看到,NSRunLoop 里面的实际地址和 CFRunLoopRef 是一致的。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容