美文网首页
学习RunLoop

学习RunLoop

作者: 好久不见_47b7 | 来源:发表于2020-03-16 16:51 被阅读0次

runloop源码地址:源码下载

runloop官方介绍:查看文档

runloop的源码在corefundation框架中,fundation里边的runloop是基于corefundation里的runloop封装的,corefundation是开源的,所以可以通过runloop的源码进行分析。

什么是runloop

runloop的字面理解就是一个运行循环。从runloop的源码中,可以清晰的看出runloop是一个对象,有入口函数,进入函数可以看到程序里边执行的是do...while循环操作,在do...while循环中处理一些操作。


图一

runloop的作用

runloop和普通的do...while程序对比:


图二
图三
  1. runloop是一个运行循环,保证程序能够持续的运行,不会退出程序。
  2. runloop不仅仅是个循环,而是进行了优化能够节省cpu的资源,提高程序的性能。使线程有工作就工作,没有工作就就开始休眠。
  3. runloop能够处理app中的许多事件如:用户的触摸事件、NSTimer的定时器事件、performSelector的延迟任务事件、通知事件和线程之间的通讯事件等。

runloop和线程的关系

1.runloop的创建、存储及获取

图四
图五

如上两幅图可以看到主线程及线程的runloop的创建及获取过程。

  1. 当全局的__CFRunloops可变字典不存在时,创建全局__CFRunloops字典。
  2. 使用主线程来创建主线程的runloop对线。
  3. 把主线程和主线程的runloop对象使用key和value的方式存储到全局的__CFRunloops字典.
  4. 获取runloop对象时,使用线程作为key在全局的__CFRunloops字典获取runloop。
  5. 线程与主线程的runloop创建、存储及获取方式是一样的。


    图六

    如上图示例代码可知:

  6. 主线程的runloop默认是开启的,而子线程的runloop默认是不开启的。
  7. 子线程的的runloop需要在子线程执行:[[NSRunLoop currentRunLoop] run];runloop才能运行,子线程才能不退出线程。

2.runloop与线程的关系总结

  1. 线程与runloop是一一对应的.
  2. 通过线程才能创建,存储及获取runloop.
  3. 如果没有线程,runloop是没有意义的。
  4. 主线程的runloop默认是开启的。
  5. 子线程的runloop是不开启的。

runloop与modes及items之间的关系

1.runloop对象

图七

由上图runloop的结构体可以看出:

  1. runloop是一个对象。
  2. runloop对象里边包含多个mode对象。
  3. runloop对面里边包含多个item对象。
  4. runloop对象里边有一个线程对象

2.mode对象

图八

由mode的结构体可以看出:

  1. mode对象里边包含多个sources0,sources1对象。
  2. mode对象里边包含多个observer及timer对象。
  3. 上述包含的这些对象都是item对象。

3.关系图

图九
线程和runloop是一一对应的,runloop和mode是1对多的关系,mode和item也是1对多的关系。runloop只能在一个mode下运行,mode之间可以来回切换。

4.五种mode模式

runloop在五种mode模式下处理事件及消息的机制是不一样的:

  1. kCFRunLoopDefaultMode:app的默认mode,通常创建runloop时,默认的mode.
  2. UITrackingRunLoopMode:界面滑动时的mode,确保在界面滑动时,不受别的mode影响。
  3. UIInitializationRunLoopMode:app刚启动时的mode,启动完成之后不再使用此mode.
  4. GSEventReceiveRunLoopMode:接收系统内部mode,一般不用。
  5. kCFRunLoopCommonModes:是一种混合mode类型。

5.三种item

  1. CFRunLoopSourceRef:分为source0和source1.
  • source0:处理app的内部事件如触摸屏幕。
  • source1:一般被用于线程之间的通讯。
  1. CFRunLoopTimerRef:用于NSTimer定时器.
  2. CFRunLoopObserverRef:用于监听runloop的状态。

源码分析

相关文章

  • IOS runloop 学习笔记

    这次学习 的内容是 runloop 1.runloop 是什么2.runloop 的作用3.runloop 和 线...

  • RunLoop学习资料

    非常好的runloop学习系列 CoreFoundation源码 RunLoop系列之源码分析 关于Runloop...

  • NSRunLoop

    前言 RunLoop的初期学习总结,后续会持续研究更新。 一、Runloop定义及作用 1. 什么是Runloop...

  • RunLoop学习总结

    通过以下文章学习记录 关于Runloop的原理探究及基本使用 深入理解RunLoop RunLoop完全指南 Ru...

  • RunLoop-基础概念(初识篇)

    学习这篇内容主要讲解RunLoop的概念,以及RunLoop和线程之间的关系。当然提及RunLoop也离不开Aut...

  • Runloop学习

    Runloop学习 | 目录 ||: ------------- || 1 什么是...

  • RunLoop学习

    RunLoop概念 人如其名,RunLoooooooooooooooop,像是一个死循环,不停的跑圈,永不懈怠。除...

  • Runloop学习

    深入理解RunLoop | Garan no dou

  • RunLoop学习

    读这篇Blog:https://blog.ibireme.com/2015/05/18/runloop/ 收货比较...

  • Runloop学习

    苹果官方的简介: The programmatic interface to objects that manag...

网友评论

      本文标题:学习RunLoop

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