runloop的source
以上是完整的 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的更多相关文章
- iOS开发RunLoop学习:三:Runloop相关类(source和Observer)
一:RunLoop相关类: 其中:source0指的是非基于端口por,说白了也就是处理触摸事件,selector事件,source1指的是基于端口的port:是处理系统的一些事件 注意:创建一个Ru ...
- iOS多线程-RunLoop简介
什么是RunLoop? 从字面上来看是运行循环的意思. 内部就是一个do{}while循环,在这个循环里内部不断的处理各种任务(比如:source/timer/Observer) RunLoop的存在 ...
- 深入理解RunLoop
网上看的一篇文章,写的真好,我得多看几次好好理解理解 膜拜大神,转载至此便于学习查看. 此处标明原文链接:http://blog.ibireme.com/2015/05/18/runloop/ ...
- 浅谈Runloop
RunLoop 是 iOS 和 OS X 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何 ...
- Runloop 深入理解(转)
RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何利 ...
- RunLoop的深入了解
RunLoop 是 iOS 和 OS X 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何 ...
- iOS 深入理解RunLoop
RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何利 ...
- runloop之于thread
做一个技术方向久了,难免会沉溺其中,对当初开始接触这个方向的许多根本上的疑问渐渐都不了了之,意识上认为然,而不知其所以然. 最近重新梳理iOS的runloop,说说自己的理解,希望能说清楚. 先抛出一 ...
- 【转】深入理解RunLoop
RunLoop 是 iOS 和 OS X 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何 ...
随机推荐
- CorelDRAW三十周年庆典暨2019新耀发布会,诚邀您的莅临!
30年时光荏苒!眨眼风惊雨过. 在1989年的春天,CorelDRAW 1.0正式发布,一经面世就掀起了图形设计行业革命浪潮,这个图形工具不仅给设计师提供了矢量图像.页面设计,更能应用于网站制作.位图 ...
- input左减右加
<!DOCTYPE html><html lang="zh"><head> <meta charset="UTF-8" ...
- day22 包,相对/绝对路径
目录 包 包被导入时发生的三件事 为什么要有包 相对路径 绝对路径 包 包是一个文件夹,也是一个模块,只是为了区分单个文件的模块,称之为包.因为单纯的文件夹无法作为模块,文件夹内的__init__.p ...
- PHP中each与list用法分析
1.each的用法 先看API array each ( array &$array ) api里是这么描述的:each — 返回数组中当前的键/值对并将数组指针向前移动一步 我们先来看看返回 ...
- 算法8-----Different Ways to Add Parentheses(不同括号结果)
题目: Given a string of numbers and operators, return all possible results from computing all the diff ...
- POJ 2115 C Looooops( 简单拓欧 + 快速幂 )
链接:传送门 题意:题目中给出一个循环 for (variable = A; variable != B; variable += C) ,这个东东还需要 mod 2^k 问至少多次能退出,如果进入死 ...
- Windows下PHP服务nginx不能使用file_get_contents的原因
注意:本文为转载,原文链接:Windows下PHP服务nginx不能使用file_get_contents/curl/fopen的原因! 一.问题说明 在Windows环境下搭建了一个本地开发服务环境 ...
- vue项目优化--使用CDN和Gzip
使用vue-cli构建的vue项目,在打包发布的时候,发现打包后的文件体积很大,使用webpack-bundle-analyzer分析后,发现占用空间最多的是引用的第三方依赖.第三方的依赖文件可以使用 ...
- BigDecimal类(高精度小数)
位置:java.math.BigDecimal 作用:提供高精度小数数据类型及相关操作 一.基本介绍 BigDecimal为不可变的.任意精度的有符号十进制数,其值为(unscaledValue * ...
- Jmeter简单应用
JMeter 是Apache组织的开源项目,是一个纯Java桌面应用,用于压力测试和性能测量. 1.安装jmeter jdk1.6以上下载地址:http://www.oracle.com/techne ...