Runloop深入理解
一、什么是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
http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_msg.html
http://mrpeak.cn/blog/ios-runloop/
Runloop深入理解的更多相关文章
- RunLoop机制理解
一.浅识RunLoop RunLoop在开发中我们一直在用,但是没有注意他.要想理解RunLoop,首先我们需要先了解一下程序运行机制. 程序运行机制:我们都知道OC是运行时语言,也就是说对象的类型是 ...
- Runloop 深入理解(转)
RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何利 ...
- Runloop理解
看了一堂公开课,自己小结一下: Runloop: 内部有三个东东:(Source, Timer, Observer) 作用/本质:1.死循环 (为app 保活): 2.监听处理事件 Timer 理解: ...
- iOS开发中对RunLoop的个人心得
从接触iOS到现在也有将近两年了,对iOS中的RunLoop也有了一定的认识,下面讲讲个人对RunLoop的理解. 初识RunLoop RunLoops是与线程相关联的基础部分,一个Run Loo ...
- 实例化讲解 RunLoop
实例化讲解RunLoop 之前看过很多有关RunLoop的文章,其中要么是主要介绍RunLoop的基本概念,要么是主要讲解RunLoop的底层原理,很少用真正的实例来讲解RunLoop的,这其中有大部 ...
- NSRunLoop个人理解
作者: xwang 出处: http://www.cnblogs.com/xwang/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保 ...
- 十八般武艺之 Runloop
嗯,runloop ,看过,用过.但是有时候突然被问到,总是不能很好的描述给他人,也许是程序员本来口拙的缘故吧.另外,也是对runloop还是理解的不够透彻. 于是乎,决定重新整理一下,加深一下印象. ...
- iOS RunLoop详解
1. RunLoop简介 1.1 什么是RUnLoop 可以理解为字面的意思:Run表示运行,Loop表示循环.结合在一起就是运行的循环.通常叫做运行循环. RunLoop实际上是一个对象,这个对象在 ...
- iOS-RunLoop
简单的说run loop是事件驱动的一个大循环,如下代码所示int main(int argc, char * argv[]) { //程序一直运行状态 while (AppIsRun ...
随机推荐
- Matlab disp()
matlab中disp()就是屏幕输出函数,类似于c语言中的printf()函数
- CSS常见布局
一.单列布局 1. 水平居中 1.1 使用inline-block和text-align .parent{text-align:center;} .child{display:inline-block ...
- vue项目导入外部css样式和js文件
<template> <div id="app" > </div> </template> <script src=" ...
- loadrunner 运行场景-运行时设置
运行场景-运行时设置 by:授客 QQ:1033553122 A. 查看.修改单个脚本的运行时设置 a) 途径1: Scenario Groups.Scenario Groups Script ...
- Kotlin入门(5)字符串及其格式化
上一篇文章介绍了数组的声明和操作,包括字符串数组的用法.注意到Kotlin的字符串类也叫String,那么String在Java和Kotlin中的用法有哪些差异呢?这便是本文所要阐述的内容了. 首先要 ...
- React JS和React-Native学习指南
自己在学习React-Native过程中整理的一份学习指南,包含 教程.开源app和资源网站等,还在不断更新中.欢迎pull requests! React-Native学习指南本指南汇集React- ...
- CSS中各种长度单位总结
在前端开发工作过程中曾碰到这样一问题: <style type="text/css"> .parent{ width:400px; height:300px; bord ...
- CRM原型
https://files.cnblogs.com/files/wcLT/CRM.zip
- Linux删除文件实现回收站功能
转载于 https://blog.csdn.net/u014057054/article/details/52126494 从事过服务器维护的人都知道rm.rm -rf 的厉害,执行起来一点也不马虎, ...
- Nginx 错误日志配置
1.Nginx错误日志信息介绍: error_log的语法格式及参数说明: error_log file level; 关键字 日志文件 错误日志级别 其中,关键字 ...