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

源码分析

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

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