Runloop原理
简单的说,runloop是一个事件循环的机制,同时能够保活线程。iOS中每个线程都对应一个runloop,主线程的runloop默认开启,其他线程的runloop默认关闭,线程与runloop是一一对应的关系,子线程的runloop会在第一次调用获取当前runloop的方法时([NSRunLoop currentRunLoop])创建(类似于懒加载)。
runloop有几种不同的mode,并且runloop每次只能在一种mode下运行,常用的有NSDefaultRunloopMode,UITrackingRunLoopMode,NSCommonRunloopModes,另外还有两个系统的runloopMode。runloopMode其实是一个数据结构,里面包含当前runloopMode所支持的事件类型(也就是modeItem),包括timer,source,observer事件。不过我们在代码里跟runloopMode交互的方式只能是通过字符串,即runloopMode的名字,不能直接访问runloopMode的数据结构。当当前的runloopMode中没有观察的事件的时候当前runloop就会退出。
NSCommonRunloopModes是一种虚拟的runloopMode,其他runloopMode可以把自己标记成NSCommonRunloopModes,所以NSCommonRunloopModes可以理解为一个runloopMode的集合,当向NSCommonRunloopModes中添加modeItem(也就是事件类型)的时候,系统会把这个modeItem加到commonModes中的每一个mode中去,所以这些mode也能够监听到对应的事件。
另外runloop的每一次循环都会被autoreleasepool包裹,所以对于autorelease的变量,内存会在每个runloop循环结束后进行释放。
runloop每一次循环处理事件的次序为:
if(有timer) {
处理timer
} else if (主队列有block) {
执行block
} else {
处理source1事件
}
Runloop原理的更多相关文章
- iOS runLoop 原理多线程 总结 NSTimer优化
		
可以理解为字面意思:Run 表示运行,Loop 表示循环.结合在一起就是运行的循环的意思.哈哈,我更愿意翻译为『跑圈』.直观理解就像是不停的跑圈. RunLoop 实际上是一个对象,这个对象在循环中用 ...
 - RunLoop 原理和核心机制
		
搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研究了RunLoop的原理和特性. RunLoop的 ...
 - 运行循环 - RunLoop
		
1.RunLoop简介 1.1 什么是RunLoop 简单来说就是:运行循环,可以理解成一个死循环,一直在运行. RunLoop实际上就是一个对象,这个对象用来处理程序运行过程中出现的各种事件(触摸. ...
 - iOS 多线程:『RunLoop』详尽总结
		
1. RunLoop 简介 1.1 什么是 RunLoop? 可以理解为字面意思:Run 表示运行,Loop 表示循环.结合在一起就是运行的循环的意思.哈哈,我更愿意翻译为『跑圈』.直观理解就像是不停 ...
 - iOS RunLoop详解
		
1. RunLoop简介 1.1 什么是RUnLoop 可以理解为字面的意思:Run表示运行,Loop表示循环.结合在一起就是运行的循环.通常叫做运行循环. RunLoop实际上是一个对象,这个对象在 ...
 - 聊聊Runloop
		
1.什么是Runloop 在开始聊RunLoop之前,我们先来了解一下程序的执行原理.一般来说,程序是在线程中执行,一个线程一次只能执行一个任务(关于GCD,可看上篇文章介绍),执行完成后线程就会退出 ...
 - iOS-RunLoop
		
简单的说run loop是事件驱动的一个大循环,如下代码所示int main(int argc, char * argv[]) { //程序一直运行状态 while (AppIsRun ...
 - iOS 事件处理机制与图像渲染过程(转)
		
iOS 事件处理机制与图像渲染过程 iOS RunLoop都干了什么 iOS 为什么必须在主线程中操作UI 事件响应 CALayer CADisplayLink 和 NSTimer iOS 渲染过程 ...
 - [iOS]多线程和GCD
		
新博客wossoneri.com 进程和线程 进程 是指在系统中正在运行的一个应用程序. 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开QQ.Xcode,系统就会分别 ...
 
随机推荐
- fragment--的生命周期
			
官网帮助文档链接: http://developer.Android.com/guide/components/fragments.html 主要看两张图,和跑代码 1,Fragment的生命周: 2 ...
 - Jmeter(三十四)Jmeter-Question之“Cookie获取”
			
2018.4.27 还在做性能测试的过程中,唉,只能说坑很多. 无明确需求.无人手协调等问题,什么都需要自己去挖掘. 本次测试的工具选型依然是Jmeter,真实场景中遇到了这么个问题.可能解决办法有点 ...
 - Python首次安装后运行报错(0xc000007b)的解决方法
			
最近在安装完Python后运行发现居然报错了,错误代码是0xc000007b,于是通过往上查找发现是因为首次安装Python缺乏VC++库的原因,下面通过这篇文章看看如何解决这个问题吧. 错误提示 ...
 - 修改了jdk在环境变量中的路径怎么cmd中的jdk版本没有变
			
把path路径下的jdk配置放在前面%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot ...
 - 20165312 C语言基础调查和JAVA学习展望
			
C语言基础调查和JAVA学习展望 一.有关学习技能的经历 掌握一项技能,我认为最重要的是练习和认真程度. 我在上幼儿园的时候学过电子琴,上台表演过多次,但是三四年之后就半途而废了,后来小学毕业之后对钢 ...
 - int main(int argc,char* argv[])浅析
			
int main(int argc,char* argv[])浅析 argc : 指输入参数个数,默认值1,就是执行程序名称 argv[] : 输入参数数组指针 举个栗子: 1. 编写一个argc.c ...
 - (转)先装VS后装IIS产生问题的解决办法
			
原文地址:http://www.cnblogs.com/mytechblog/articles/1897682.html 基于.net的web程序设计asp.net,我们就必须安装VS和IIS,但这二 ...
 - Json3:使用gson做节点解析
			
Gson的节点对象:JsonElement : 所有的节点 都是 JsonElement 对象.JsonPrimitive : 基本的数据类型的节点对象,JsonElement的子类JsonNull ...
 - Thinkphp3.2+PHPQRCode 二维码生成示例
			
下载phpqrcode 整合到Thinkphp框架 在“ThinkPHP\Library\Vendor\”下新建目录phpqrcode,将压缩包内容解压到该文件夹下. 下载地址:http://www. ...
 - Java 7-Java 循环结构 - for, while 及 do…while
			
Java 循环结构 - for, while 及 do...while 顺序结构的程序语句只能被执行一次.如果您想要同样的操作执行多次,,就需要使用循环结构. Java中有三种主要的循环结构: whi ...