详解performselector应用场景 performselector实现原理( 二 )


这个 mode 就是 CFRunLoopModeRef 类型,所以里面存储一堆的 CFRunLoopModeRef 类型的 mode 。
而 _currentMode 也是 CFRunLoopModeRef 这个类型,所以我们很容易得出一个结论:
一个 RunLoop 对象里面有一堆的 mode,也就是存在 _modes 里面,里面只有一个是 _currentMode 。
我们再窥探一下源码,看下 mode 里面存储的是什么?
所以我们来个总结的图:
RunLoop 有很多种模式,对应的 _currentMode 只有一种 。
CFRunLoopModeRef1.CFRunLoopModeRef 它是代表 RunLoop 的运行模式;
2.一个 RunLoop 包含若干个 Mode,每个 Mode 又包含若干个Source0/Source1/Timer/Observer;
3.RunLoop 启动时只能选择其中一个 Mode,作为 currentMode;
4.如果需要切换 Mode,只能退出当前 RunLoop,再重新选择一个 Mode 进入;
5.不同组的Source0/Source1/Timer/Observer 能分割开来,互不影响;
6.如果 Mode 里面没有任何Source0/Source1/Timer/Observer,RunLoop 会立马退出;
如果只能在一种模式下运行,对性能什么的都有很大好处,比如我在滑动模式下,不考虑不滑动的模式,所以就不会卡顿,顺畅很多 。还有注意的就是,它切换 mode 是在循环里面切换的,所以不会导致程序退出 。
常见的 mode 有 2 种,其他情况很少见,所以掌握这两个一般都是没问题了
1.KCFRunLoopDefaultMode (NSDefaultRunLoopMode):App 的默认 Mode,通常是主线程是在这个 Mode 下运行;
2.UITrackingRunLoopMode : 界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响;
RunLoop 到底做哪些事?RunLoop 在不停执行的时候到底具体做了哪些事?其实是 RunLoop 在不停循环的时候,就是处理每个 mode 下的 Source0、Source1、Timer、Observer 这里面的事件,那我们就来看看这里面具体对应的到底是什么事件 。
Source0
触摸事件、performSelector:onThread:
比如我们的 touchbegin 这个我们看下下面的代码:
Source1
基于 Port 的线程间的通信,系统事件的捕捉 。
(两个线程之间相互传递消息的处理,系统事件捕捉,其实也包括触摸事件,只是把事件捕捉到以后传递给 Source0) 。
Timer
NSTimer 定时器,performSelector:withObject:afterDelay (这个方法的底层实现也就是 NSTimer 来实现的) 。
Observers
用于监听 RunLoop 的状态,UI 的刷新 (BeforeWaiting),Autorelease pool(BeforeWaiting) 。
(在 RunLoop 休眠之前都会去执行 UI 的刷新啊、Autorelease pool 的释放等)
以上这些东西,完全就是我们平时开发中经常写的代码,比如设置背景色,设置 frame 等等 。
由于 RunLoop 知识点比较多,如果写太多不利于大家的阅读和消化,所以其他内容放在后面介绍!


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: