文章插图
RunLoop 学习起来是很抽象,也不好理解,所以一定多看几次,多学学才能学好!这也是中高级 iOS 必须掌握的知识点,面试中经常遇到
什么是 RunLoop?Run 表示运行,Loop 表示循环 。结合在一起就是运行循环的意思 。RunLoop 就是在程序运行过程中循环做一些事情.
RunLoop 的应用范畴有哪些?定时器 (Timer)、PerformSelector
GCD Async Main Queue
事件响应、手势识别、界面刷新
网络请求
AutoreieasePool
上面这些底层都是 RunLoop 在支撑,说白了,如果没有 RunLoop 支撑,上面的这些都无法实现 。
如果没有 RunLoop 会发生什么呢?像我们的命令行项目,创建出来默认就是没有 RunLoop,请看下图
因为没有 RunLoop,程序执行到第 13 行的时候,就会自动退出.
而我们 iOS 项目的 main 函数里面都有 UIApplicationMain(argc, argv, nil, appDelegateClassName);这个代码,这里就是创建了一个主线程的 RunLoop,所以我们程序不会退出,一直在运行中 。我们可以大致写一下 main 函数里面的伪代码如下:
retVal 这个等于 0,当没有事件处理的时候,RunLoop 就会 sleep 就是类似睡觉,一旦有事件需要处理,比如点击、刷新事件等 process_message 就会去处理这个事件,处理完了继续休息,retVal=0,程序就会一直执行,不会退出,这就是 RunLoop 作用 。
RunLoop 的基本作用1.保持程序的持续运行
2.处理 App 中的各种事件(比如触摸事件、定时器事件等)
3.节省了 CPU 资源,提高程序性能:该做事时做事,该休息时休息
…
获取 RunLoop 对象iOS 中有 2 套 API 来访问和使用 RunLoop :
Foundation : NSRunLoop (OC 语言里面的)
Core Foundation : CFRunLoopRef (C 语言里面的)
NSRunLoop 和 CFRunLoopRef 都代表着 RunLoop 对象
NSRunLoop 是基于 CFRunLoopRef 的一层 OC 包装
CFRunLoopRef 是开源的.(CFRunLoopRef 参考链接)
其实我们很多都是由 OC 包装出来的,请看下面:
获取当前的 RunLoop
获取当前 RunLoop 和主线程 RunLoop
获取 RunLoop
这里注意 “地址不一样” 因为 NSRunLoop 是对 CFRunLoopDef 做了一层包装,你可以用 OC 的 NSLog(“%@”,[NSRunLoop MainRunLoop]) 获取对比一下,它的地址就是 C 语言获取的地址 。主线程只有一个 RunLoop 。
RunLoop 与线程每条线程都有唯一的一个与之对应的 RunLoop 对象(一一对应)
RunLoop 保存在一个全局的 Dictionary 里,线程作为 key,RunLoop 作为 value
线程刚创建的时候并没有 RunLoop 对象,RunLoop 会在第一次获取它时创建
RunLoop 会在线程结束时销毁
主线程的 RunLoop 已经自动创建,子线程默认没有开启 RunLoop 。
源码窥探看一下:CFRunLoopGetCurrent
由于源码不能像 objc 直接打开,我们把它拉到项目中查看 。
从字典也能看出来是一对一的关系 。而且确实是第一次获取的时候是空的,然后再去创建这个 RunLoop 。
那我们就继续来了解 RunLoop 内部的数据结构,到底是怎么工作的 。
RunLoop 相关的类Core Foundation 中关于 RunLoop 的 5 个类
1.CFRunLoopRef
2.CFRunLoopModeRef
3.CFRunLoopSourceRef
4.CFRunLoopTimerRef
5.CFRunLoopObserverRef
再看下 CFRunLoopRef 的底层源码:
就是上面这个结构体,我们用到的可能就是红色这些.pthread 是线程,每个 runloop 都会保存这个东西 。最后面那个 _modes,这个是个集合来着,CFMutableSetRef 我们能想到我们自己用的 set 也是一个集合来着,比如 NSMutableSet 也是一个集合,所以这个 _modes 里面是存着一堆的 mode 。
以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!
「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助:- 详解word单独删除某一页 在word2013怎么删除空白页
- 二 四十二式太极拳教学图文详解
- 一 四十二式太极拳教学图文详解
- 四 四十二式太极拳教学图文详解
- 三 四十二式太极拳教学图文详解
- 太极拳24式1-4式图片详解
- 太极剑剑法招式要点详解
- 详解陈氏太极拳的特性
- 养生太极拳 详解武当太极拳九式
- linux下压缩文件夹命令 linux zip命令详解