第七节—Runtime的介绍

本文为L_Ares个人写作,以任何形式转载请表明原文出处。

这个Runtime我相信做iOS开发的各位小伙伴简直太熟悉了。全都知道它是运行时吧。我写这篇的主要目的就是回顾复习一下这个iOS开发中的重中之重Runtime,如果有错误的地方,还请各位小伙伴帮忙指出,感激不尽。

一、什么是Runtime

聊到Runtime就不得不提一下CC++这两位大哥,在CC++中,程序从代码变成一个可执行的程序,通常都要经历5个步骤 :

预处理--->编译--->汇编--->链接--->可执行文件

而在链接的时候,对象的类型和方法的实现就已经确定好了,这时候你已经无法动态的去修改它们了。

但是,为了让OC变得灵活,苹果在底层利用CC++汇编混合开发了一套api,这套apiOC提供了运行时可以动态修改一些方法的功能,这套api就是Runtime。由于有了这套RuntimeOC就变成了一门运行时语言。

总结一句更简单的话说Runtime :

Runtime就是一套由CC++汇编混编的库,这个库提供了api,在程序运行的时候可以动态的对方法和对象做一些操作。

二、关于运行时

说到运行时,这个其实应该是程序员的一个必备素质,运行时说的再明白一点,就是可执行文件的加载。

这个是不是就无比的熟悉了?

其实就是C语言的代码变成输出的流程吧。看一下,里面运行时和编译将是重点比对,毕竟Runtime这个库最重要的功能还是给OC提供运行时的灵活操作。

  • 预处理(Preprocessing) : 也有人叫它预编译,主要处理的就是#开头的东西,比如#include啊,比如#define啊,这之类的。就是把这些东西定义的东西插入到它们该插入的地方。

  • 编译(Compilation) : 把高级语言(比如CC++等等就不举例了)变成汇编语言,啥是汇编语言?说白了就是机器指令,就是一大段英文字母的文字,这段文字都是命令,发给计算机的命令。在这个阶段,会对你给计算机发的命令进行查错,比如语法分析啊、词法分析啊之类的。这个阶段是静态的。

  • 汇编(Assembly) : 就是把你上面编译的机器指令全变成01。这回就不是人类能轻易看懂的东西了。

  • 链接(Linking) : 你的代码可能会用到很多的第三方库吧,就是把你的代码和库揉搓成一个可执行的文件。

这里重点来了,就是运行时

  • 加载(Loading) : 这就是运行时,就是把你链接完成的可执行文件从磁盘放到内存里面。然后计算机就对着你的可执行文件疯狂输出,这个过程被runtime搞成了动态的,就是在你的代码输出之前,runtime可以改了它。这就是所谓的运行时。

三、Runtime怎么用

大体的看,常用的方式就3种。

  • 通过OC代码,这里就是我们要探索Runtime的最直接的入口了,毕竟我们写的大多还是OC。怎么通过 OC代码?其实不是我们通过OC代码,而是编译的时候,OC的方法会变成objc_msgSend,例如 : [person run];

  • 通过NSObject,这个怎么理解呢?这个其实最好理解,因为在OC中,万物皆NSObject。可以点到 NSObject.h去看一下。例如 : isKindOfClass

  • 通过Runtime的API,这就是更直白的了,直接上手用Runtime了。例如 : object_getClass

下面放一张图来理解一下,通过3种方式是如何可以使用Runtime的。

图片.png

Runtime System Library的方法和最上面的三个是映射关系,通过编译(Complier)完成的映射。

这里我就不再多加内容了,因为对Runtime的介绍实际就这么多,毕竟这是一套api,本节不对Runtimeapi做多的解释,主要就是说明这个库的一些常识。下节开始进入Runtime的探索。

你可能感兴趣的:(第七节—Runtime的介绍)