likes
comments
collection
share

一文搞懂Runtime,知其然知其所以然!面试涨薪没毛病!!

作者站长头像
站长
· 阅读数 27

前言

要想深刻理解Runtime机制,只需搞懂以下几点:

  • what:什么是Rnutime?
  • why:为什么要学习Runtime机制呀?
  • How:知道Runtime底层工作原理吗?
  • where:常见的Runtime应用场景在哪里呢? 接下来我也会从以上几点按顺序讲解。废话不多说,优秀的人已经点赞关注了。

什么是Runtime?

Runtime是什么?顾名思义,其概念⽆⾮就是“因为 Objective-C 是⼀⻔动态语⾔,所以它需要⼀个运⾏时系统……这就是 Runtime 系统”云云。对博主这种菜⻦⽽⾔,Runtime 在实际开发中,其实就是⼀组C语⾔的函数。胡适说:“多研究些问题,少谈些主义”,云⼭雾罩的概念听多了总是容易头晕,接下来我们直接从代码⼊⼿学习

运行时。Objective-C 语言将尽可能多的决策从编译时和链接时推迟到运行时。 只要有可能,它就会动态地做事。 这意味着该语言不仅需要编译器,还需要运行时系统来执行编译后的代码。 运行时系统充当Objective-C语言的一种操作系统; 这就是使语言起作用的原因。

一文搞懂Runtime,知其然知其所以然!面试涨薪没毛病!!

clang 是一个 C、C++ 和 Objective-C 编译器,包括预处理、解析、优化、代码生成、汇编和链接。

一文搞懂Runtime,知其然知其所以然!面试涨薪没毛病!!

编译器:clang -rewrite-objc

一文搞懂Runtime,知其然知其所以然!面试涨薪没毛病!! 经过编码后的中间码哦。

一文搞懂Runtime,知其然知其所以然!面试涨薪没毛病!!

NSObject 类⾥⾯的⼏个动态运⾏时的⽅法

一文搞懂Runtime,知其然知其所以然!面试涨薪没毛病!!

一文搞懂Runtime,知其然知其所以然!面试涨薪没毛病!!

一文搞懂Runtime,知其然知其所以然!面试涨薪没毛病!!

为什么要学习Runtime机制吖?

一文搞懂Runtime,知其然知其所以然!面试涨薪没毛病!!

  • 在开始分享之前,我也是犹豫了很⻓时间是否需要在团队⾥⾯分享runtime,因为runtime是⼀柄双刃剑,理解的好,⽤的好,就能写出⼀些⾼效实⽤的代码,⽤的不好,也能坑队友于⽆形之中。正所谓,步⼦⼤了容易扯着蛋呀。
  • 学习runtime是程序员进阶的⼀个必要的过程,不单单是oc,所有语⾔的编程学习到⼀定的⽔平,就要开始研究改语⾔底层的编译运⾏机制,我们这⾥所说的研究,并不是值要灵活使⽤底层的⽅法,⽽是去了解和熟知底层运⾏的机制,所以只能分享⼀些基础的学习内容,后续⼤家可以⾃⾏研究
  • 基本功能点:1.交换⽅法、2.动态添加⽅法、3.动态添加属性、4.字典转模型 其实好的三⽅库或多或少都有对runtime 运⽤哦!
  • 更好的理解、类、对象、消息机制、以及运⾏期间代码动态交互过程,⿊魔法必备武器库!

How:Runtime底层工作原理是怎样呢?

  • 发送消息(Messaging)
  • 动态⽅法解析(Dynamic Method Resolution)
  • 消息转发(Message Forwarding)
  • 类型编码&属性申明

一文搞懂Runtime,知其然知其所以然!面试涨薪没毛病!!

一文搞懂Runtime,知其然知其所以然!面试涨薪没毛病!!

一文搞懂Runtime,知其然知其所以然!面试涨薪没毛病!!

    1. 发送消息(Messaging):

一文搞懂Runtime,知其然知其所以然!面试涨薪没毛病!!

  • 2. 了解Runtime 数据结构!:

一文搞懂Runtime,知其然知其所以然!面试涨薪没毛病!!

  • 3. 发送消息(Messaging forward):

一文搞懂Runtime,知其然知其所以然!面试涨薪没毛病!!

一文搞懂Runtime,知其然知其所以然!面试涨薪没毛病!!

  • 4. 动态⽅法解析(Dynamic Method Resolution)

一文搞懂Runtime,知其然知其所以然!面试涨薪没毛病!!

完整消息转发机制

一文搞懂Runtime,知其然知其所以然!面试涨薪没毛病!!

Talking is cheap Show Me the Code

一文搞懂Runtime,知其然知其所以然!面试涨薪没毛病!!

Runtime常⽤API汇总

一文搞懂Runtime,知其然知其所以然!面试涨薪没毛病!!

补充环节

  • 知识点1:Type Encoding

为了协助运行时系统,编译器将每个方法的返回和参数类型编码为字符串,并将该字符串与方法选择器相关联。 它使用的编码方案在其他上下文中也很有用,因此通过 @encode() 编译器指令公开可用。 当给定类型规范时,@encode() 返回编码该类型的字符串。 类型可以是基本类型,例如 int、指针、标记结构或联合,或类名——事实上,任何类型都可以用作 C sizeof() 运算符的参数。

  • 知识点2:关于动态加载 Dynamic Loading

Objective-C 程序可以在运行时加载和链接新的类和类别。 新代码被合并到程序中,并与开始时加载的类和类别相同。动态加载可用于做很多不同的事情。 例如,系统偏好应用程序中的各种模块是动态加载的。

尽管有一个运行时函数可以在 Mach-O 文件中动态加载 Objective-C 模块(objc_loadModules,在 objc/objc-load.h 中定义),但 Cocoa 的 NSBundle 类为动态加载提供了一个明显更方便的接口——一个对象 面向并与相关服务相结合。 有关 NSBundle 类及其使用的信息,请参阅 Foundation 框架参考中的 NSBundle 类规范。 有关 Mach-O 文件的信息,请参阅 OS X ABI Mach-O 文件格式参考。

Where:常⻅的Runtime应⽤场景在哪⾥呢?

  1. 实现第⼀个场景:跟踪程序每个ViewController展示给⽤户的次数,可以通过Method Swizzling替换ViewDidAppear初始⽅法。创建⼀个UIViewController的分类,重写⾃定义的ViewDidAppear⽅法,并在其+load⽅法中实现ViewDidAppear⽅法的交换
  2. 开发中常需要在不改变某个类的前提下为其添加⼀个新的属性,尤其是为系统的类添加新的属性,这个时候就可以利⽤Runtime的关联对象(Associated Objects)来为分类添加新的属性了
  3. 三实现字典的模型和⾃动转换,优秀的JSON转模型第三⽅库JSONModel、YYModel等都利⽤runtime对属性进⾏获取,赋值等操作,要⽐KVC进⾏模型转换更加强⼤,更有效率。阅读YYModel的源码可以看出,YY⼤神对NSObject的内容进⾏了⼜⼀次封装,添加了许多描述内容。其中YYClassInfo是对Class进⾏了再次封装,⽽YYClassIvarInfo、YYClassMethodInfo、YYClPropertyInfo分别是对Class的Ivar、Method和property进⾏了封装和描述。在提取

基本上就是这样啦,若果有什么想法和错误,欢迎在评论区留言讨论,最后求一波点赞关注,需要资料请点击下方获取。

iOS资料:下载地址

转载自:https://juejin.cn/post/7024702713631866916
评论
请登录