一、什么是Runloop?为什么需要Runloop?

  Runloop,顾名思义,即运行循环。

  没有Runloop的情况下,一个线程执行完一个任务,就会退出并销毁。等到需要处理下一个任务时,再重新创建一个线程。

    1、当任务小而多时,频繁地创建和销毁线程,会带来不小的代价。

    2、主线程要是退出了,整个iOS/OSX应用就挂了。

  因此,需要一种能让线程不退出、有任务时可以及时处理、没任务时又可以不占用CPU的机制。这种机制就是event loop,Runloop是event loop在iOS/OSX中的实现。

二、Runloop的实现

  Runloop提供了两种API,一种是Foundation中Objective-C实现的NSRunloop;另一种是CoreFoundation中纯C实现的CFRunloopRef,NSRunloop是对CFRunloopRef的封装。

  官方文档给出的主要流程:

  对应的主要源码:

__CFRunLoopDoObservers(kCFRunLoopEntry); // 1、通知Observer,进入Runloop
do {
// Runloop的一次迭代
__CFRunLoopDoObservers(kCFRunLoopBeforeTimers); // 2、通知Observer,即将处理timer
__CFRunLoopDoObservers(kCFRunLoopBeforeSources); // 3、通知Observer,即将处理source
__CFRunLoopDoSources0(); // 4、处理source0
__CFRunLoopServiceMachPort(); // 5、
__CFRunLoopDoObservers(kCFRunLoopBeforeWaiting); // 6、通知Observer,即将休眠等待
__CFRunLoopSetSleeping(); // 7、休眠等待
__CFRunLoopDoObservers(kCFRunLoopAfterWaiting); // 8、通知Observer,即将被唤醒
__CFRunLoopDoTimers() // 9.1、处理timer
__CFRunLoopDoSource1(); // 9.2、处理source1
} while;
__CFRunLoopDoObservers(kCFRunLoopExit); // 10、通知Observer,结束Runloop

mach_msg:从目标端口发送或者接收消息的系统调用。

mach port

MACH_SEND_MSG

MACH_RCV_MSG

消息队列

基于port的source1事件

mach_msg_trap

performSelector

main queue

三、Runloop Mode

四、Runloop的应用

1、AutoreleasePool

2、AFNetworking

五、Mach进程间通信

参考链接:

https://opensource.apple.com/source/CF/CF-635.19/CFRunLoop.c.auto.html

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW23

http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_msg.html

http://mrpeak.cn/blog/ios-runloop/

Runloop深入理解的更多相关文章

  1. RunLoop机制理解

    一.浅识RunLoop RunLoop在开发中我们一直在用,但是没有注意他.要想理解RunLoop,首先我们需要先了解一下程序运行机制. 程序运行机制:我们都知道OC是运行时语言,也就是说对象的类型是 ...

  2. Runloop 深入理解(转)

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

  3. Runloop理解

    看了一堂公开课,自己小结一下: Runloop: 内部有三个东东:(Source, Timer, Observer) 作用/本质:1.死循环 (为app 保活): 2.监听处理事件 Timer 理解: ...

  4. iOS开发中对RunLoop的个人心得

    从接触iOS到现在也有将近两年了,对iOS中的RunLoop也有了一定的认识,下面讲讲个人对RunLoop的理解.   初识RunLoop RunLoops是与线程相关联的基础部分,一个Run Loo ...

  5. 实例化讲解 RunLoop

    实例化讲解RunLoop 之前看过很多有关RunLoop的文章,其中要么是主要介绍RunLoop的基本概念,要么是主要讲解RunLoop的底层原理,很少用真正的实例来讲解RunLoop的,这其中有大部 ...

  6. NSRunLoop个人理解

    作者: xwang 出处: http://www.cnblogs.com/xwang/  本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保 ...

  7. 十八般武艺之 Runloop

    嗯,runloop ,看过,用过.但是有时候突然被问到,总是不能很好的描述给他人,也许是程序员本来口拙的缘故吧.另外,也是对runloop还是理解的不够透彻. 于是乎,决定重新整理一下,加深一下印象. ...

  8. iOS RunLoop详解

    1. RunLoop简介 1.1 什么是RUnLoop 可以理解为字面的意思:Run表示运行,Loop表示循环.结合在一起就是运行的循环.通常叫做运行循环. RunLoop实际上是一个对象,这个对象在 ...

  9. iOS-RunLoop

    简单的说run loop是事件驱动的一个大循环,如下代码所示int main(int argc, char * argv[]) {     //程序一直运行状态     while (AppIsRun ...

随机推荐

  1. 汇编语言--CPU资源和存储器(二)

    二.CPU资源和存储器 需要访问的硬件资源主要有:CPU内部资源.存储器和I/O端口. 1.寄存器组 (1)16位寄存器组 16位CPU所含有的寄存器有(见图2.1中16位寄存器部分): 4个数据寄存 ...

  2. 移动端FastClick和editor冲突问题。

        FastClick.prototype.needsClickForParent = function (target) {         let parent = target.parent ...

  3. Node.js+Koa开发微信公众号个人笔记(二)响应事件

    微信公众号中的事件有订阅事件/扫码事件/点击事件/跳转链接事件等等,具体可以查阅文档. 这里来实现一下订阅事件,其他的事件的实现过程也都类似. 当有人订阅了公众号后,微信服务器会向我们的服务器推送一个 ...

  4. 【代码笔记】Web-HTML-表格

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  5. “由于无法验证发行者,所以WINDOWS已经阻止此软件”的解决方法

    Vista 和 Windows7 系统都很注重系统的安全性,在提高安全性的同时,也给我们某些应用带来不便,例如需要安装插件或证书,可能会弹出“由于无法验证发行者,所以WINDOWS已经阻止此软件”的相 ...

  6. Ansible--常用模块使用

    ansible命令解释 通过ansible命令执⾏的任务称为ad-hoc命令(任务),其实它是相对playbook⽽⾔的.通常,命令⾏⽤来实现ansible的批量管理功能,playbook⽤来实现批量 ...

  7. 【转】PHP 杂谈 坑爹的file_exists

    转自:http://www.cnblogs.com/baochuan/archive/2012/05/06/2445822.html 介绍   我发现了一个问题,今天与大家分享.我把整个过程描述一下. ...

  8. weblogic系列漏洞整理 -- 2. weblogic弱口令

    目录 二. weblogic弱口令 0. 思路 1. python爆破脚本 2. 技巧 一.weblogic安装 http://www.cnblogs.com/0x4D75/p/8916428.htm ...

  9. 【PAT】B1036 跟奥巴马一起编程(15)(15 分

    #include<stdio.h> int main() { int row,col; char c; scanf("%d %c",&col,&c); ...

  10. 彻底修改 Windows 系统用户名

    在 Windows 安装的时候会输入一个用户名,电脑店装的一般都会给你设置成Admin之类的.这个时候你想要改成自己的,一般都是直接在 控制面板 > 用户帐户和家庭安全 > 用户帐户 &g ...