iOS runloop整理归纳

先附个图<盗个图, 懒得自己画了-_-> 图片来源, 同时这篇文章写的也超级详细, 推荐!!!
PS:图片里的顺序与源码顺序稍稍有点出入, 但是不影响整体的理解~

01111.png

CFRunLoop源码地址

runloop整理:
    1. runloop和线程是一对一的关系.
    2. 主线程runloop程序启动自动获取; 子线程的runloop需要显示获取CFRunLoopGetCurrent().
    3. 线程中的runloop在没有source、timer、obsever时, 会退出或者不进入循环.
    4. 一次runloop对应一种mode, mode一共有4种, 公开的有2种, default & tracking 两种, 还有一种集合commonMode, 是前两种的集合
    5. runloop mode {kCFRunLoopDefaultMode, UITrackingRunLoopMode}. 每种mode又分别可以包含3种modeItem {CFRunLoopSourceRef<source0, source1>, CFRunLoopTimerRef<timer>, CFRunLoopObserverRef<observer>}
    6. runloop内有autoreleasepool的创建和销毁; 即将进入runloop会创建自动释放池, 在处理完source0和block后即将进入休眠时, 会销毁自动释放池并且再新建一个释放池; runloop退出时会销毁释放池.
    7. runloop 处理事件流程:
        1) 调用 CFRunLoopRunSpecific() 函数. 先判断runloop是否正在销毁或者 runloopmode为空, 若为空则不进入循环, 否则将rl->_currentMode设置为当前mode, 同时发送kCFRunLoopEntry的通知.
        2) 进入 __CFRunLoopRun() 函数. 判断rl || rlm是否处于stop, 是则不进入循环, 否则继续.
        3) 处理超时时间, 如果设置的时间在限制之内, 当超时时, 会向外部发送超时通知.
        4) 进入do while 循环, 1先通知外部即将处理timer事件, 2再通知外部即将处理source事件
        5) 3处理block<block是以单向链表的形式存储的>, __CFRunLoopDoBlocks() 内部会调用私有函数 __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__
        6) 4处理source0事件<UIEvent, CFSocket>, 如果有source0则再次调用__CFRunLoopDoBlocks处理block
        7) 5发送即将进入休眠的通知, 同时进入休眠状态.
        8) 6进入内部循环, 等待接收系统事件<source1>的唤醒. 若收到事件, 则跳出内部循环, 同时发送即将唤醒的通知
        9) 7处理收到的消息, 如果是定时器<timer>则处理定时器事件; 如果是dispatch到main queue的block则调用 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ 执行block; 如果是source事件, 先判断是否有source1事件, 有则处理source1; 最后再处理一次block
        10) 8判断一下retValue值, 如果是CFRunLoopRunResult其中一种状态, 则runloop运行循环继续; 否则为0则退出循环.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353