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

近期有些网友想要了解performselector实现原理的相关情况,小编通过整理给您分析,同时介绍一下详解performselector应用场景有关信息。RunLoop学习起来是很抽象,也不好理解,所以一定多看几次,多学学才能学好!这也是...

近期有些网友想要了解performselector实现原理的相关情况,小编通过整理给您分析,同时介绍一下详解performselector应用场景有关信息。

RunLoop 学习起来是很抽象,也不好理解,所以一定多看几次,多学学才能学好!这也是中高级 iOS 必须掌握的知识点,面试中经常遇到

什么是 RunLoop?

Run 表示运行,Loop 表示循环。结合在一起就是运行循环的意思。RunLoop 就是在程序运行过程中循环做一些事情.

RunLoop 的应用范畴有哪些?

定时器 (Timer)、PerformSelector

GCD Async Main Queue

事件响应、手势识别、界面刷新

网络请求

AutoreieasePool

上面这些底层都是 RunLoop 在支撑,说白了,如果没有 RunLoop 支撑,上面的这些都无法实现。

如果没有 RunLoop 会发生什么呢?像我们的命令行项目,创建出来默认就是没有 RunLoop,请看下图

performselector实现原理(详解performselector应用场景)-图1而我们 iOS 项目的 main 函数里面都有 UIApplicationMain(argc, argv, nil, appDelegateClassName);这个代码,这里就是创建了一个主线程的 RunLoop,所以我们程序不会退出,一直在运行中。我们可以大致写一下 main 函数里面的伪代码如下:

performselector实现原理(详解performselector应用场景)-图2

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 包装出来的,请看下面:

performselector实现原理(详解performselector应用场景)-图3获取当前 RunLoop 和主线程 RunLoop

performselector实现原理(详解performselector应用场景)-图4这里注意 “地址不一样” 因为 NSRunLoop 是对 CFRunLoopDef 做了一层包装,你可以用 OC 的 NSLog(“%@”,[NSRunLoop MainRunLoop]) 获取对比一下,它的地址就是 C 语言获取的地址。主线程只有一个 RunLoop。

RunLoop 与线程

每条线程都有唯一的一个与之对应的 RunLoop 对象(一一对应)

RunLoop 保存在一个全局的 Dictionary 里,线程作为 key,RunLoop 作为 value

线程刚创建的时候并没有 RunLoop 对象,RunLoop 会在第一次获取它时创建

RunLoop 会在线程结束时销毁

主线程的 RunLoop 已经自动创建,子线程默认没有开启 RunLoop。

performselector实现原理(详解performselector应用场景)-图5由于源码不能像 objc 直接打开,我们把它拉到项目中查看。

performselector实现原理(详解performselector应用场景)-图6那我们就继续来了解 RunLoop 内部的数据结构,到底是怎么工作的。

RunLoop 相关的类

Core Foundation 中关于 RunLoop 的 5 个类

1.CFRunLoopRef

2.CFRunLoopModeRef

3.CFRunLoopSourceRef

4.CFRunLoopTimerRef

5.CFRunLoopObserverRef

再看下 CFRunLoopRef 的底层源码:

performselector实现原理(详解performselector应用场景)-图7这个 mode 就是 CFRunLoopModeRef 类型,所以里面存储一堆的 CFRunLoopModeRef 类型的 mode。

而 _currentMode 也是 CFRunLoopModeRef 这个类型,所以我们很容易得出一个结论:

一个 RunLoop 对象里面有一堆的 mode,也就是存在 _modes 里面,里面只有一个是 _currentMode。

我们再窥探一下源码,看下 mode 里面存储的是什么?

performselector实现原理(详解performselector应用场景)-图8

performselector实现原理(详解performselector应用场景)-图9

CFRunLoopModeRef

1.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 这个我们看下下面的代码:

performselector实现原理(详解performselector应用场景)-图10基于 Port 的线程间的通信,系统事件的捕捉。

(两个线程之间相互传递消息的处理,系统事件捕捉,其实也包括触摸事件,只是把事件捕捉到以后传递给 Source0)。

Timer

NSTimer 定时器,performSelector:withObject:afterDelay (这个方法的底层实现也就是 NSTimer 来实现的)。

Observers

用于监听 RunLoop 的状态,UI 的刷新 (BeforeWaiting),Autorelease pool(BeforeWaiting)。

(在 RunLoop 休眠之前都会去执行 UI 的刷新啊、Autorelease pool 的释放等)

以上这些东西,完全就是我们平时开发中经常写的代码,比如设置背景色,设置 frame 等等。

由于 RunLoop 知识点比较多,如果写太多不利于大家的阅读和消化,所以其他内容放在后面介绍!

阅读前请先查看【免责声明】本文内容由互联网用户自发贡献,该文观点仅代表作者本人,本站仅供展示。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 1217266901@qq.com 举报,一经查实,本站将立刻删除。 转载请注明出处:https://m.jingfakeji.com/tech/89503.html

上一篇 2025年01月02日 17:43
下一篇 2025年01月03日 08:55

相关推荐

  • 原宥是什么意思,指原谅/宽恕的意思(主要用于书面中)

    最近《星汉灿烂》热播,引起无数网友的关注,而在《星汉灿烂》中出现了一个词“原宥”,难道了很多人,都不知道原宥是什么意思,甚至连“宥”这个词怎么读都不清楚,其实“原宥”所指的就是“宽恕”、“原谅”的意思,下面我们就一起来具体了解一下!原宥是什...

    2025年06月13日
    181
  • come的喂abc是什么梗,用来和小学生接头的新暗号

    最近在抖音上又火了一个“come的喂abc”,是继孤勇者之后成为了新的“小学生对接暗号”,那么come的喂abc是什么梗呢?其实就是新的小学生暗号梗,如果对着小学生说“come的喂”,那么他们就会回复你“abc”,不信的话你可以去找一个小学...

    2025年06月13日
    129
  • 为什么说千万不要打流感疫苗4价,担心会有不良反应

    “流管疫苗”能预防大量的流感型病毒,但为什么在网上有人说千万不要打流感疫苗4价呢?其实这种说法是完全不正确的,也是太片面的说法。如果对4价流感疫苗本身的成分有禁忌的话才不建议打的,一般情况下接种4价流感疫苗是没有坏处的,所以在接种前要了解清...

    2025年06月13日
    187
  • 斐乐是哪个国家的品牌,来自意大利的高端时尚运动品牌

    近些年来斐乐慢慢走进我们的视野,很多人都以为斐乐是韩国的品牌,但其实不是的,那么斐乐是哪个国家的品牌呢?下面小编就带大家一起来了解一下斐乐这个运动品牌,感兴趣的朋友快来看看吧。斐乐是哪个国家的品牌斐乐是一个来自意大利的高端时尚运动品牌,不过...

    2025年06月13日
    151
  • 充电宝放在车里面会爆炸吗,车里温度过高就会爆炸

    充电宝小巧方便,外出的时候我们都会在车里放个充电宝,便于及时为手机充电。但其实充电宝放在车里并不是一个好的选择,特别是夏季的时候,在阳光的照射下,车内温度极高,充电宝放在车里很危险。那么充电宝放在车里面会爆炸吗?下面我们就一起来了解一下吧。...

    2025年06月13日
    127
  • 光线追踪有什么要求吗,显卡最低rtx2060起步

    对很多喜欢玩游戏的人来说,可以选择实时光线追踪是再好不过的,因为这会让游戏体验有巨大的飞升,可惜的是并不是所有电脑都能开光线追踪。电脑开光线追踪有什么要求吗?下面小编就来跟大家说说什么样的电脑才能开光线追踪,快来看看你的电脑符不符合要求吧。...

    2025年06月13日
    202

联系我们

在线咨询: QQ交谈

邮箱:1217266901@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信