本文为L_Ares个人写作,以任何形式转载请表明原文出处。
这个Runtime
我相信做iOS开发的各位小伙伴简直太熟悉了。全都知道它是运行时吧。我写这篇的主要目的就是回顾复习一下这个iOS开发中的重中之重Runtime
,如果有错误的地方,还请各位小伙伴帮忙指出,感激不尽。
一、什么是Runtime
聊到Runtime
就不得不提一下C
和C++
这两位大哥,在C
和C++
中,程序从代码变成一个可执行的程序,通常都要经历5个步骤 :
预处理--->编译--->汇编--->链接--->可执行文件
而在链接
的时候,对象的类型和方法的实现就已经确定好了,这时候你已经无法动态的去修改它们了。
但是,为了让OC
变得灵活,苹果在底层利用C
、C++
、汇编
混合开发了一套api
,这套api
为OC
提供了运行时可以动态修改一些方法的功能,这套api
就是Runtime
。由于有了这套Runtime
,OC
就变成了一门运行时语言。
总结一句更简单的话说Runtime
:
Runtime
就是一套由C
、C++
、汇编
混编的库,这个库提供了api
,在程序运行的时候可以动态的对方法和对象做一些操作。
二、关于运行时
说到运行时,这个其实应该是程序员的一个必备素质,运行时说的再明白一点,就是可执行文件的加载。
这个是不是就无比的熟悉了?
其实就是C
语言的代码变成输出的流程吧。看一下,里面运行时和编译将是重点比对,毕竟Runtime
这个库最重要的功能还是给OC
提供运行时的灵活操作。
-
预处理(Preprocessing)
: 也有人叫它预编译,主要处理的就是#
开头的东西,比如#include
啊,比如#define
啊,这之类的。就是把这些东西定义的东西插入到它们该插入的地方。 -
编译(Compilation)
: 把高级语言(比如C
、C++
等等就不举例了)变成汇编语言,啥是汇编语言?说白了就是机器指令,就是一大段英文字母的文字,这段文字都是命令,发给计算机的命令。在这个阶段,会对你给计算机发的命令进行查错,比如语法分析啊、词法分析啊之类的。这个阶段是静态的。 -
汇编(Assembly)
: 就是把你上面编译的机器指令全变成0
和1
。这回就不是人类能轻易看懂的东西了。 -
链接(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
的。

Runtime System Library
的方法和最上面的三个是映射关系,通过编译(Complier)
完成的映射。
这里我就不再多加内容了,因为对Runtime
的介绍实际就这么多,毕竟这是一套api
,本节不对Runtime
的api
做多的解释,主要就是说明这个库的一些常识。下节开始进入Runtime
的探索。
网友评论