详解performselector应用场景 performselector实现原理


详解performselector应用场景 performselector实现原理

文章插图
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小编还为您精选了以下内容,希望对您有所帮助: