美文网首页iOS 开发 Objective-C
iOS 底层 day17 RunLoop 初识

iOS 底层 day17 RunLoop 初识

作者: 望穿秋水小作坊 | 来源:发表于2020-09-12 15:31 被阅读0次

一、初识 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 是一致的。

相关文章

  • iOS 底层 day17 RunLoop 初识

    一、初识 RunLoop(整体概念) 1. 什么是 RunLoop? 顾名思义:运行循环 在程序运行过程中循环做一...

  • iOS底层面试题--RunLoop

    什么是RunLoop? iOS底层面试题--RunLoop RunLoop面试题分析

  • Runloop

    Runloop 实现原理及应用iOS - RunLoop 底层源码详解及具体运用

  • iOS底层学习27 -- runloop初识

  • 探寻RunLoop的本质

    iOS底层原理总结 - RunLoop 面试题 讲讲 RunLoop,项目中有用到吗? RunLoop内部实现逻辑...

  • RunLoop

    详细文章 xx_cc - iOS底层原理总结 - RunLoop 意一ineyee - RunLoop RunLo...

  • iOS底层原理——浅谈RunLoop

    RunLoop应用:线程保活 线程保活、控制销毁 iOS-浅谈RunLoop8iOS底层原理总结 - RunLoo...

  • RunLoop相关

    iOS底层原理总结 - RunLoop解密 Runloop Runloop是一种在当前线程,持续调度各种任务的运行...

  • [iOS] 初识Runloop

    最近想写的topic太多了,但好多是和view相关的,所以吧就先谈一下Runloop了~源码链接:https://...

  • ios RunLoop 初识

    初识 字面意思:运行循环,程序运行过程中循环处理事情. 它的实际: 实际是一个对象,这个对象提供一个入口函数,执行...

网友评论

    本文标题:iOS 底层 day17 RunLoop 初识

    本文链接:https://www.haomeiwen.com/subject/ydtyektx.html