美文网首页
RunLoop总结

RunLoop总结

作者: ChancePro | 来源:发表于2018-04-26 17:19 被阅读13次

Runloops是线程相关底层基础的一部分。它的本质和字面意思一样运行着的循环(事件处理的循环)。
作用:接受循环事件和安排线程的工作。
目的:让线程在有任务的时候忙于工作,而没有任务的时候处于休眠状态。

Runloop概念

Runloop运行循环
iOS中通常所说的Runloop指的是NSRunloop(Foundation框架)或者CFRunloopRef(CoreFoundation框架),CFRunloopRef是纯C的函数,而NSRunloop仅仅是CFRunloopRef的一层OC封装。

Runloop作用

  1. 保持程序的持续运行。
  2. 处理App中的各种事件。(如:touches触摸事件、NSTimer定时器事件、Selector事件)
  3. 节省CPU资源,提高程序性能(有事情就做事情,没事情就休息,资源释放)
  4. 负责渲染屏幕上的所有UI。

Runloop开启&退出

在UIApplicationMain函数内部开启了一个和主线程相关的RunLoop (保证主线程不会被销毁),导致 UIApplicationMain 不会返回,一直在运行中,也就保证了程序的持续运行。
Runloop 的退出条件:
App退出;线程关闭;设置最大时间到期;

RunLoop和线程关系

  1. 每条线程都有唯一的一个与之对应的Runloop对象。
  2. 主线程的RunLoop已经自动创建,子线程的RunLoop需要主动创建。
  3. RunLoop在第一次获取时创建,在线程结束时销毁。
  4. Runloop对象是利用字典来进行存储,Key:线程 Value:线程对应的Runloop
创建子线程对应的Runloop

currentRunLoop

RunLoop相关类

CFRunLoopRef: RunLoop本身
CFRunLoopModeRef: 运行模式
CFRunLoopSourceRef: 事件源
CFRunLoopTimerRef: Timer事件
CFRunLoopObserverRef: 观察者(监听者)

  1. 一条线程 对应一个 Runloop,Runloop 总是运行在某种特定的CFRunLoopModeRef(运行模式)下。
  2. 每个 Runloop 都可以包含若干个 Mode ,每个 Mode 又包含Source源 / Timer事件 / Observer观察者。
  3. 在 Runloop 中有多个运行模式,每次调用 RunLoop 的主函数【__CFRunloopRun()】时,只能指定其中一个 Mode(称 CurrentMode)运行, 如果需要切换 Mode,只能是退出 CurrentMode 切换到指定的 Mode 进入,目的以保证不同 Mode 下的 Source / Timer / Observer 互不影响。
  4. Runloop 有效,mode 里面 至少 要有一个timer(定时器事件) 或者是source(源)。
Mode

kCFRunLoopDefaultMode App的默认Mode,通常主线程是在这个Mode下运行。
UITrackingRunLoopMode 界面跟踪 Mode,用于 ScrollView 追踪触摸滑动
UIInitializationRunLoopMode 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用。
GSEventReceiveRunLoopMode 接受系统事件的内部 Mode,通常用不到。
kCFRunLoopCommonModes 一种模式组合

Source

Source0:非基于端口Port的事件(用于用户主动触发的事件,如:点击按钮或点击屏幕)。
Source:基于端口Port的事件(通过内核和其他线程互相发送消息)

Timer

NSTimer受RunLoop的Model影响。GCD定时器不受RunLoop影响。

Observer

消息循环中的监听器

RunLoop休眠

RunLoop 最核心的事情就是保证线程在没有消息时休眠以避免占用系统资源,有消息时能够及时唤醒。 RunLoop 的这个机制完全依靠系统内核来完成,具体来说是苹果操作系统核心组件 Darwin 中的 Mach 来完成的。

相关文章

  • RunLoop

    RunLoop 文章已经很多了,结合各大文章做个总结 什么是 RunLoop RunLoop 人如其名,run 跑...

  • iOS RunLoop 总结以及相关面试题解答

    iOS RunLoop 总结以及相关面试题解答 iOS RunLoop 总结以及相关面试题解答

  • NSRunLoop

    【iOS程序启动与运转】- RunLoop个人小结 RunLoop总结:RunLoop的应用场景(三) 走进Run...

  • iOS开发经验(18)-Runloop

    目录 Runloop RunLoop 与线程 个人理解总结 应用场景 1. 什么是RunLoop 基本作用 保持程...

  • 探寻RunLoop的本质

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

  • iOS面试点文章链接

    runtime基础方法、用法、消息转发、super: runtime 完整总结 runloop源码、runloop...

  • RunLoop数据结构、RunLoop的实现机制、RunLoop

    推荐阅读:备战2020——iOS全新面试题总结 RunLoop概念 RunLoop的数据结构 RunLoop的Mo...

  • RunLoop

    iOS刨根问底-深入理解RunLoop runloop 和线程有什么关系 iOS 多线程:RunLoop详细总结

  • RunLoop 的相关概念

    此篇为对 RunLoop 的相关概念的总结,主要介绍 RunLoop 的一些概念 RunLoop 简介 RunLo...

  • RunLoop相关

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

网友评论

      本文标题:RunLoop总结

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