天天关注:performselector实现原理(什么是 RunLoop?)
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。
这个 mode 就是 CFRunLoopModeRef 类型,所以里面存储一堆的 CFRunLoopModeRef 类型的 mode。
而 _currentMode 也是 CFRunLoopModeRef 这个类型,所以我们很容易得出一个结论:
一个 RunLoop 对象里面有一堆的 mode,也就是存在 _modes 里面,里面只有一个是 _currentMode。
我们再窥探一下源码,看下 mode 里面存储的是什么?
所以我们来个总结的图:
RunLoop 有很多种模式,对应的 _currentMode 只有一种。
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 这个我们看下下面的代码:
Source1
基于 Port 的线程间的通信,系统事件的捕捉。
(两个线程之间相互传递消息的处理,系统事件捕捉,其实也包括触摸事件,只是把事件捕捉到以后传递给 Source0)。
Timer
NSTimer 定时器,
performSelector:withObject:afterDelay (这个方法的底层实现也就是 NSTimer 来实现的)。
Observers
用于监听 RunLoop 的状态,UI 的刷新 (BeforeWaiting),Autorelease pool(BeforeWaiting)。
(在 RunLoop 休眠之前都会去执行 UI 的刷新啊、Autorelease pool 的释放等)
以上这些东西,完全就是我们平时开发中经常写的代码,比如设置背景色,设置 frame 等等。
由于 RunLoop 知识点比较多,如果写太多不利于大家的阅读和消化,所以其他内容放在后面介绍!
标签:
相关阅读
-
天天关注:performselector实现原理(什么是 RunLoop?)
RunLoop学习起来是很抽象,也不好理解,所以一定多看几次,多学学才能学好!这也是中高级iOS必须掌握的...
2023-02-24 -
asgardia项目网站是什么(Asgardia网站怎么注册?)
Asgardia项目是什么?10月11日,一支国际性科学家团队宣布将成立首个太空国家,该项目命名为Asgardia,...
2023-02-24 -
js压缩工具哪些好(推荐这15款压缩工具:JavaScript Minifier)
JavaScript代码压缩是指去除源代码里的所有不必要的字符,而不改变其功能的过程。这些不必要的字符通常...
2023-02-24 -
天天关注:performselector实现原理(什么是 RunLoop?)
RunLoop学习起来是很抽象,也不好理解,所以一定多看几次,多学学才能学好!这也是中高级iOS必须掌握的...
2023-02-24 -
asgardia项目网站是什么(Asgardia网站怎么注册?)
Asgardia项目是什么?10月11日,一支国际性科学家团队宣布将成立首个太空国家,该项目命名为Asgardia,...
2023-02-24 -
js压缩工具哪些好(推荐这15款压缩工具:JavaScript Minifier)
JavaScript代码压缩是指去除源代码里的所有不必要的字符,而不改变其功能的过程。这些不必要的字符通常...
2023-02-24 -
root权限是什么意思?root权限有什么用?一文详细了解 新视野
什么root权限?Root权限和我们在windows系统下的administrator权限可以理解成一个概念。只有拥有了这个...
2023-02-24 -
100wh等于多少毫安 充电宝多少毫安可以带上飞机 焦点消息
100wh等于多少毫安和电压有关系,比如电压是10V,100wh 10*1000=10000mAh。以一般充电宝3 7V电压为例...
2023-02-24 -
电脑复制粘贴快捷键_复制粘贴的快捷键是什么(Ctrl + C 复制)|环球观天下
windows系统中快捷键的使用总可以提高工作效率,不少新手朋友都不怎么习惯使用快捷键或者说不知道怎么使...
2023-02-24 -
ntldr是什么意思 ntldr is missing故障原因介绍
NTLDR是windows系统启动时必需的一个文件,有很多朋友的电脑出现“NTLDRismissingPressanykeytorestart...
2023-02-24 -
全球资讯:机构:2022年全球手游收入回落至788亿美元 预计2023年重回上升通道
SensorTower发布分析报告称,2018年至2021年,全球手游内购收入不断增长。随着疫情对全球移动市场影响的...
2023-02-24 -
微软希望用 ChatGPT 控制机器人为人类提供日常服务-全球关注
微软与人工智能聊天工具ChatGPT背后开发商OpenAI的合作已经在科技行业掀起追求人工智能的热潮。在最新的...
2023-02-24 -
新《使命召唤》由大锤开发IW监督 将延续《现代战争2》 重点聚焦
据外媒消息,动视今年的《使命召唤》作品更像是现代战争,由Sledgehammer领导开发,InfinityWard监督。
2023-02-24 -
《街头霸王6》新实机 展示嘉米等三个新角色|焦点快播
索尼2023StateofPlay节目中,除了《生化危机4:重制版》外,Capcom还展示了格斗游戏《街头霸王6》的新角...
2023-02-24 -
【环球新要闻】3d touch有什么功能 3d touch有哪些特殊功能呢?
3dtouch有什么功能?3dtouch特殊功能介绍。3DTouch是苹果官方在推出iPhone6s 6sPlus时加入加入的一项新...
2023-02-24
精彩推荐
阅读排行
相关词
- 【当前独家】电视剧琅琊榜风起长林结局是什么 相关信息介绍
- 天天观速讯丨摩登家庭大结局 最后怎么样了?
- 博世冰箱怎么样_博世冰箱特色功能-焦点速读
- 乐视电视怎么样 乐视电视性能评测 乐视电视优点介绍
- 环球快报:LOMO相机是什么 LOMO的起源
- 环球热点!key是什么意思?cd key是什么意思?
- 空调节能模式是什么意思?空调节能模式能省多少电 热闻
- 《长安幻想》又又又搞事啦!新款秀恩爱方式你学会了吗?|新消息
- 2020情人节是几月几号 情人节简介
- 青春文学小说畅销书作家有哪些 一起来看看吧
- 全球即时看!艺考多一点文化课要求没坏处
- 天天日报丨诺基亚音乐手机大全 诺基亚音乐手机产品系列介绍
- 填写完整的QQ群资料该怎样填写
- 苹果ipad2越狱步骤详解 ipad2越狱步骤教程如下
- 鬼节是什么时候 鬼节是哪一天(农历七月十五)
- 微软希望用 ChatGPT 控制机器人为人类提供日常服务-全球关注
- 汤唯演过的电影 汤唯电影大盘点,有你看过的吗 当前独家
- 全球热头条丨《自杀小队:战胜正义联盟》需全程联网 单机也要
- 如何把cd转换成mp3 详细内容分享
- 新《使命召唤》由大锤开发IW监督 将延续《现代战争2》 重点聚焦
- 风扇转速_CPU风扇转速调节方法 查看CPU风扇转速步骤
- 《吸血鬼:避世血族-绝唱》Steam页面上线 5月18日发售-快消息
- 天龙八部哪个门派厉害 感兴趣的进来看看吧_环球新视野
- 精品迭出 网络电影精耕细作结硕果
- 英雄杀怎么玩?英雄杀快速上手教程 不会的玩家快码住 焦点热讯
- 乔任梁电视剧有哪些:《锦绣缘华丽冒险》_全球独家
- 蒂埃里·科斯卡斯出任雪铁龙品牌全球CEO
- 能耐的近义词是什么 词语造句分享
- 翁虹演过的电影 有你看过的吗? 聚焦
- 海尔电视机怎么样 海尔MOOKA50寸电视机介绍
- 即时:望洋兴叹的兴的意思 小编带你详细了解
- 不属于清洁能源的是什么 相关内容介绍给你
- 书香街道携手书店开展 “亲子共读推荐好书”短视频大赛
- 快资讯丨保护野生动物,公安机关盯上动物园、马戏团
- 焦点热文:打印机无法安装怎么办 打印机无法安装解决方法
- 【速看料】空调3匹是什么意思 1匹的制冷量大约是多少
- 电脑游戏手柄怎么用 电脑游戏手柄怎么设置,详细方法教给你 焦点信息
- 古剑奇谭百里屠苏介绍 男主由谁饰演 全球观天下
- 天天热点评!床上用品批发市场哪里便宜 快和小伙伴来看看吧
- 股票卖出时按哪个价格卖的?今天买的股票什么时候能卖出?
- 泛海控股存债务融资工具违约情况 被交易商协会严重警告
- 八批药品集采,哪些药降价最多?一图读懂_热头条
- RingCentral与AWS达成战略合作 头条
- “营业”65年的海口汽车东站拟于4月关停!交通部门请你来提意见|最新
- 伊甸骑士团好玩吗 伊甸骑士团玩法简介
- 2023海口、合肥两地游客互送计划启动
- 原子之心发电机怎么激活|世界快播报
- 伊甸骑士团官网在哪下载 最新官方下载安装地址 今日最新
- 全球热推荐:约翰威克暗黑什么时候出 公测上线时间预告
- 时讯:刺激求生大作战什么时候出 公测上线时间预告
- 中信建投:房地产行业融资环境逐步改善 坚定看好销售复苏
- Epic喜加一:《杜尔瑟斯》免费领取
- 焦点讯息:接近4万!《原子之心》Steam在线峰值38469人
- 环球观热点:浆系纸企陆续发布涨价函 造纸板块再度拉升
- 卖的比老头环快!《霍格沃茨之遗》销量破1200万
- 交行信用卡逾期了一天有影响吗?交行信用卡有没有三天还款宽限期?
- 信用卡激活必须去银行吗?激活信用卡必须本人吗?
- 国债逆回购需要每天操作吗?国债逆回购可以天天买吗?
- 两部漫威大片口碑票房遇冷 老套剧情难令观众满意
- 体育电影依旧非燃不可?
- 内蒙古将持续开展安全隐患大排查大整治 当前热闻
- 助力电影制作,拓展想象空间——科幻电影背后的“中国制造”
- 热点聚焦:遭证监会立案调查 奥联电子大幅低开
- 千方百计搜救 全力以赴救治——内蒙古阿拉善左旗露天煤矿坍塌事故救援进行时
- 支付宝备用金逾期产生的后果有哪些?支付宝备用金上征信吗?
- 环球聚焦:冷空气难抵升温趋势 全国大部晴好天气上线
- 观热点:我的糖果工厂好玩吗 我的糖果工厂玩法简介
- 斯泰兰蒂斯发布2022年业绩,净利润168亿欧元 全球讯息
- 每日简讯:我的糖果工厂官网在哪下载 最新官方下载安装地址
- 焦点简讯:秘法少年什么时候出 公测上线时间预告
- 中信证券:社融超预期,工程机械行业反转在即
- 三亚有“暖气”,藏不住了! 天天视讯
- 天天观焦点:大力先生官网在哪下载 最新官方下载安装地址
- 喵呜向前冲好玩吗 喵呜向前冲玩法简介
- 王者荣耀:甄姬的新年限定皮肤曝光!玩家:好像我家的沐浴露……
- 房贷审批期间可以用网贷吗?有房贷会影响网贷通过吗?
- 《狂飙》收官 热度仍“狂飙”
- 《前任4:英年早婚》杀青 韩庚郑恺于文文回归
- 超百Gbps容量!成功上天! 环球百事通
- 为什么大盘总是高开低走?股票高开低走第二天会涨吗?
- 天天消息!欧委会要求工作人员卸载TikTok,TikTok发言人:已澄清事实
- 中央气象台:弱冷空气将影响华北东北|天天看点
- 世界微速讯:战国对头双鸟首青铜剑吉林首展 罕见融合中原特点
- 全球连线|河北四台新石器时代遗址入选2022年中国考古新发现|今日快讯
- 投资选择基金还是信托?信托基金和基金的区别有哪些?
- 环球视讯!Q卡三国官网在哪下载 最新官方下载安装地址
- 理财的钱可以随时取出吗?存定期可以随时取出吗?
- 当前看点!斯泰兰蒂斯集团宣布15亿欧元股票回购计划,持续至2023年底
- 约翰威克暗黑官网在哪下载 最新官方下载安装地址 世界热闻
- 怎么看个股中散户数量?同花顺散户数量准吗?
- 代号火之书官网在哪下载 最新官方下载安装地址 通讯
- 今日视点:天启冒险官网在哪下载 最新官方下载安装地址
- 重庆方斗村:“原始”村落展新颜
- 基金可以做抵押吗?征信不好可以抵押房产贷款吗?
- 基金投资怎么算收益?c类基金为什么不适合定投?
- 新手买基金好还是买股票好?买基金赚钱还是炒股赚钱?
- 基金类型有哪些?基金包括股票和债券吗?
- 世界讯息:超级富豪的生活官网在哪下载 最新官方下载安装地址
- 热资讯!你被爱奇艺薅了吗?1.2亿会员为它充值,一年收入177亿
- 工信部:2022年我国锂离子电池行业产值突破1.2万亿元
- 中物联公路货运分会:超六成企业预期2023年业务收入将增长
- 兰博基尼飓风漂移好玩吗 兰博基尼飓风漂移玩法简介
- 挂机才会赢什么时候出 公测上线时间预告
- 当前简讯:生存到死2什么时候出 公测上线时间预告
- 天天消息!交通运输部:过去五年完成交通固定资产投资超17万亿元
- “向海图强”:辽宁大连着力做好海洋经济文章_当前看点
- 兰博基尼飓风漂移官网在哪下载 最新官方下载安装地址
- 我的小镇城市机场好玩吗 我的小镇城市机场玩法简介 环球热闻
- 我们是光荣的“雷锋传人”——陆军第79集团军某旅“雷锋班”传承雷锋精神纪实_天天即时看
- 勇者之心魂环大陆什么时候出 公测上线时间预告 世界微速讯
- 最新!海南省长冯飞会见腾讯党委书记奚丹 全球资讯
- 焦点速读:暴走脑洞官网在哪下载 最新官方下载安装地址
- 合金幻想什么时候出 公测上线时间预告
- 天天快资讯丨厨房小家电上市公司去年业绩分化 行业追求差异化、品牌化 服务消费升级
- 宝宝安全座椅好玩吗 宝宝安全座椅玩法简介-当前看点
- 漂移向前好玩吗 漂移向前玩法简介-全球热推荐
- 微动态丨原神3.5版本能获得多少原石 3.5零氪党月卡党防沉迷党原石总计
- 当前快讯:供应平衡需求抬升 制冷剂行业暖意渐浓
- 世界热议:崩坏星穹铁道人非草木其二任务完成攻略介绍
- 《黎明觉醒生机》可玩性高但手感欠佳的开放世界生存手游
- 《剑雨如歌》耐性怎么练 耐性训练方法分享_环球信息
- 快播:如何做自己的扑克牌_如何做自己的扑克牌模型
- 传奇世界 新服再闹新春
- 《深海》入围柏林电影节 外媒赞“超乎想象” 当前视点
- 要闻速递:奋进的春天|握好“人才”之笔,“苏”写高质量发展新画卷
- 天天热文:沪上阿姨外包装图片惹争议,有员工称涉事包装已很久没用
- 天天即时:不负好春光 复苏正当时
- 聚焦:应急管理部工作组在内蒙古阿拉善左旗指导露天煤矿坍塌事故救援处置工作
- 打击治理“黑广播”“伪基站”成效明显
- 两部门印发关于进一步加强耐药结核病防治工作的通知
- 句号上面怎么打出来_句号怎么打句号在下面那个特殊符号|动态
- 翡翠大王好玩吗 翡翠大王玩法简介_每日速看
- 2023年海南省气排球全国邀请赛琼海站圆满收官 当前热议
- 大球吞小球好玩吗 大球吞小球玩法简介_环球今日报
- 环球资讯:终极力量等级战士好玩吗 终极力量等级战士玩法简介
- 蘑菇2248什么时候出 公测上线时间预告
- 【环球新视野】寻迹千年苏东坡|高山仰止,再遇东坡——走进澄迈海口
- 在海南买茅台将比内地便宜
- 短讯!点击看看官网在哪下载 最新官方下载安装地址
- 【地评线】荔枝网评:培育更多“小巨人” 聚集创新“大能量”
- 奋进的春天丨江苏盐城:不负好时光 打好“第一仗” 奏响农业生产“春之曲”-信息
- 【地评线】视评:生活需要“小修小补”
- 微速讯:奋进的春天 | 江苏镇江:时隔三年,再启程!“海外抢单团”出发拓市场
- 海报|扬州:奋进的春天,奔跑吧“好地方”!
- 宝马中国召回8587辆进口宝马R1250系列摩托车_全球动态
- 地狱研究所什么时候出 公测上线时间预告_世界快播
- 当前消息!儋州治水三步走 力争年内消除城市黑臭水体
- 全球时讯:恐龙巴士官网在哪下载 最新官方下载安装地址
- 海南举办现代服务业专场招聘会 69家单位携1960个岗位进场揽才_世界快播报
- 全球新动态:东坡文旅大会|琼剧《苏东坡在海南》海口精彩上演