学习RunLoop

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的状态。

源码分析

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 废话不多说, 来啊, 互相伤害啊!! 0. RunLoop资料 苹果官方文档:https://developer....
    东方_未明阅读 1,221评论 1 20
  • 好记性不如烂笔头。本文是根据官方文档整理的笔记,理论性比较强,基础知识,如有错误还请指正。 Run Loops是线...
    繁华落尽丶lee阅读 373评论 0 0
  • 上一节主要讲了RunLoop的理论的基础知识, 这一节讲一讲实践:修正一点: 根据源码,runloop要跑起来先判...
    东方_未明阅读 827评论 1 5
  • 一.RunLoop简介 运行循环,在程序运行过程中循环做一些事情,如果没有Runloop程序执行完毕就会立即退出,...
    Jt_Self阅读 331评论 0 0
  • 作业:(1)熟悉那段“经文”,找到出处;(2)学会分层次挖掘法,尝试着将话题引向深入!本文选自迕又新教授的《心理治...
    晋春77阅读 107评论 0 0