以上是完整的 CFRunLoop 和 CFRunLoopMode 的结构体源码(太长了我的妈,用不着看完),下面我精简一下,把重要的留下,看如下代码(可以仔细看一下,加深印象):


上面是精简出来比较关键的 RunLoop 和 RunLoopMode 的结构体,从上面源码可以看出:

一个 RunLoop 对象有一个用来被唤醒的端口 _wakeUpPort,一个当前运行的 mode 叫 _currentMode,以及若干个 _modes_commonModes_commonModeItems(commonModes这2个东西后面详细讲)。runLoop 有很多 mode,即 _modes,但是只有一个 _currentMode,RunLoop 一次只能运行在一个 mode 下,如果需要切换 Mode,只能退出 Loop,不可能在多个 Mode 下同时运行(这是iOS运行流畅的原因之一)。

从 runLoopMode 的组成可以看出来:mode管理了所有的事件(Source/Timer/Observer 被称为 Mode Item),而 RunLoop 管理着若干个 mode。

这两个结构体中,已经涉及到了我们的所有五个类了,关于他们的关系我后面会详细说,这里简单的看看,对他们有个印象,混个脸熟,先来看 CFRunLoopSourceRef

CFRunLoopSourceRef

在我 RunLoopMode 数据结构代码中可以看到这两个东西 CFMutableSetRef _source0 和 CFMutableSetRef _source1,首先这两个东西是 Set(集合),集合中存放的是一堆数据结构(这里就可以对应上面蓝色底那张图来看,这是那种图图里面的Source集合的部分),那这个 source 到底是个什么东西呢,在 RunLoopMode 结构体的注释中我也写了,他们其实也是一个数据结构 CFRunLoopSourceRef。那 CFRunLoopSourceRef 结构又是怎样的呢,我们再来看下面它的结构代码:


上面代码贴出来了三个数据结构,其他多余的别看,光看我注释的部分就行,其中第一个数据结构 __CFRunLoopSource 包含一个 _context 成员,他的类型是 CFRunLoopSourceContext 或者是 CFRunLoopSourceContext1,也就是后面两个数据结构。

大家可以从我重点看我注释的行 CFRunLoopSourceContext(其实就是source0的数据结构)和 CFRunLoopSourceContext1(source1) 的区别就在于 CFRunLoopSourceContext1(source1) 多了一个 mach_port_t 接收消息的端口。mach_port_t 这又是个什么玩意儿,这里暂时不用管,可以简单的啰嗦两句,mach是iOS系统内核的心脏,他管理着处理器的资源,关于它的一些结构和原理,我以后会写一篇文章来描述它的结构和工作原理,现在我还是把话收回来说主题,不走远了。

这里简单总结一下:

  • CFRunLoopSourceRef 是事件产生的地方;
  • 这个 CFRunLoopSourceRef 有两个版本就是 source0 和 source1;
  • source0只包含一个回调(函数指针),不能主动出发事件,需要 CFRunLoopSourceSignal(source) 将 Source 标记为待处理,CFRunLoopWakeUp(runloop) 唤醒 RunLoop,让其处理事件
  • source1包含 mach_port 和一个回调(函数指针),用于通过内核和其它线程相互发送消息,能主动唤醒 RunLoop。

http://www.cnblogs.com/CrazyD0u/p/6481092.html

      • 我们在这里绑定了两个参数一个是signal触发的函数,一个是函数的参数,至于其他参数的用途,可以看看苹果官方文档的说明:
    • version
    • Version number of the structure. Must be 0.
    • info
    • An arbitrary pointer to program-defined data, which can be associated with the CFRunLoopSource at creation time. This pointer is passed to all the callbacks defined in the context.
    • retain
    • A retain callback for your program-defined info pointer. Can be NULL.
    • release
    • A release callback for your program-defined info pointer. Can be NULL.
    • copyDescription
    • A copy description callback for your program-defined info pointer. Can be NULL.
    • equal
    • An equality test callback for your program-defined info pointer. Can be NULL.
    • hash
    • A hash calculation callback for your program-defined info pointer. Can be NULL.
    • schedule
    • A scheduling callback for the run loop source. This callback is called when the source is added to a run loop mode. Can be NULL.
    • cancel
    • A cancel callback for the run loop source. This callback is called when the source is removed from a run loop mode. Can be NULL.
    • perform
    • A perform callback for the run loop source. This callback is called when the source has fired.

runloop的source的更多相关文章

  1. iOS开发RunLoop学习:三:Runloop相关类(source和Observer)

    一:RunLoop相关类: 其中:source0指的是非基于端口por,说白了也就是处理触摸事件,selector事件,source1指的是基于端口的port:是处理系统的一些事件 注意:创建一个Ru ...

  2. iOS多线程-RunLoop简介

    什么是RunLoop? 从字面上来看是运行循环的意思. 内部就是一个do{}while循环,在这个循环里内部不断的处理各种任务(比如:source/timer/Observer) RunLoop的存在 ...

  3. 深入理解RunLoop

    网上看的一篇文章,写的真好,我得多看几次好好理解理解 膜拜大神,转载至此便于学习查看. 此处标明原文链接:http://blog.ibireme.com/2015/05/18/runloop/    ...

  4. 浅谈Runloop

    RunLoop 是 iOS 和 OS X 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何 ...

  5. Runloop 深入理解(转)

    RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何利 ...

  6. RunLoop的深入了解

    RunLoop 是 iOS 和 OS X 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何 ...

  7. iOS 深入理解RunLoop

    RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何利 ...

  8. runloop之于thread

    做一个技术方向久了,难免会沉溺其中,对当初开始接触这个方向的许多根本上的疑问渐渐都不了了之,意识上认为然,而不知其所以然. 最近重新梳理iOS的runloop,说说自己的理解,希望能说清楚. 先抛出一 ...

  9. 【转】深入理解RunLoop

    RunLoop 是 iOS 和 OS X 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何 ...

随机推荐

  1. CorelDRAW三十周年庆典暨2019新耀发布会,诚邀您的莅临!

    30年时光荏苒!眨眼风惊雨过. 在1989年的春天,CorelDRAW 1.0正式发布,一经面世就掀起了图形设计行业革命浪潮,这个图形工具不仅给设计师提供了矢量图像.页面设计,更能应用于网站制作.位图 ...

  2. input左减右加

    <!DOCTYPE html><html lang="zh"><head> <meta charset="UTF-8" ...

  3. day22 包,相对/绝对路径

    目录 包 包被导入时发生的三件事 为什么要有包 相对路径 绝对路径 包 包是一个文件夹,也是一个模块,只是为了区分单个文件的模块,称之为包.因为单纯的文件夹无法作为模块,文件夹内的__init__.p ...

  4. PHP中each与list用法分析

    1.each的用法 先看API array each ( array &$array ) api里是这么描述的:each — 返回数组中当前的键/值对并将数组指针向前移动一步 我们先来看看返回 ...

  5. 算法8-----Different Ways to Add Parentheses(不同括号结果)

    题目: Given a string of numbers and operators, return all possible results from computing all the diff ...

  6. POJ 2115 C Looooops( 简单拓欧 + 快速幂 )

    链接:传送门 题意:题目中给出一个循环 for (variable = A; variable != B; variable += C) ,这个东东还需要 mod 2^k 问至少多次能退出,如果进入死 ...

  7. Windows下PHP服务nginx不能使用file_get_contents的原因

    注意:本文为转载,原文链接:Windows下PHP服务nginx不能使用file_get_contents/curl/fopen的原因! 一.问题说明 在Windows环境下搭建了一个本地开发服务环境 ...

  8. vue项目优化--使用CDN和Gzip

    使用vue-cli构建的vue项目,在打包发布的时候,发现打包后的文件体积很大,使用webpack-bundle-analyzer分析后,发现占用空间最多的是引用的第三方依赖.第三方的依赖文件可以使用 ...

  9. BigDecimal类(高精度小数)

    位置:java.math.BigDecimal 作用:提供高精度小数数据类型及相关操作 一.基本介绍 BigDecimal为不可变的.任意精度的有符号十进制数,其值为(unscaledValue * ...

  10. Jmeter简单应用

    JMeter 是Apache组织的开源项目,是一个纯Java桌面应用,用于压力测试和性能测量. 1.安装jmeter jdk1.6以上下载地址:http://www.oracle.com/techne ...