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 ...
随机推荐
- JS window与document
开头语:嗯~~~~~~~~~ 正文如下 一.window window是Javascript中的最高级对象,它是document.location和history对象的父对象.正因为window是一个 ...
- Python 练习:简单的购物车
salary = int(input("Please input your salary: ")) msg = ''' 1. iphone6s 5800 2. mac book 9 ...
- Loadrunner 脚本开发-利用Loadrunner生成Web service测试脚本
脚本开发-利用Loadrunner生成Web service测试脚本 1.选择协议--Web Service,如下图 2.导入服务 入口1:点击Manage Services ->弹出窗中选择“ ...
- Kotlin入门(9)函数的基本用法
上一篇文章介绍了Kotlin新增的空安全机制,控制语句部分可算是讲完了,接下来将连续描述Kotlin如何定义和调用函数,本篇文章先介绍函数的基本用法. 前面几篇文章介绍控制语句之时,在setOnCli ...
- Kotlin入门(18)利用单例对象获取时间
前面介绍了,使用扩展函数可以很方便地扩充数组Array的处理功能,例如交换两个数组元素.求数组的最大元素等等.那么除了数组之外,日期和时间的相关操作,也是很常见的,比如获取当前日期,获取当前时间.获取 ...
- [iOS] WSHorizontalPickerView 图片水平滚动封装
之前这篇文章传送门本来是记录自己练手的demo的,后来很多人来问我要代码.今天就抽时间封装了一下,没有考虑太多情况,等我有空再去仔细考虑吧. 代码在:Github 用法很简单,创建对象,设置数据源,记 ...
- (网页)人人都会的35个Jquery小技巧
转自CSDN: 收集的35个 jQuery 小技巧/代码片段,可以帮你快速开发. 1. 禁止右键点击 $(document).ready(function(){ $(document).bind(&q ...
- Ant使用及项目实践
1.简介 Ant 是一个 Apache 基金会下的跨平台的基于 Java 语言开发的构件工具.这是一个基于开放的操作系统构建和部署的工具,该工具需要从命令行执行. 2.特点 Ant 是基于 Java ...
- Jmeter中默认语言的显示
1.临时性语言的设置 即设置后只对本次使用有效,重启后恢复默认语言 选择Options—>Choose Language—>选择其他语言(例如:Chinese(Simplified)简体中 ...
- 游标和递归sql 的一些代码
DECLARE @UserID INT; --推广员帐号 DECLARE @ProxyID INT; --代理帐号 ; --分数 SELECT @UserID = [SpreaderID] FROM ...