Runtime详解


runtime简介


OC中的runtime是一个运行时库(runtime Libarary),它是一个主要使用C和汇编写的库,为C添加了面向对象的能力并创造了OC。这就是说它在类信息(class information)中被加载,完成所有需要的结构体,让OC的面向对象编程变为可能。


runtime详解

OC是面向运行时的语言(runtime oriented language),就是说它会尽可能的把编译和链接时要执行的逻辑延迟到运行时。这就是给了你很大的灵活性,你可以按需要把消息重定向给合适的对象,你甚至可以变换方法的实现,等等。


runtime简称运行时,就是系统在运行的时候的一些机制,其中最主要的是消息机制。OC的函数调用称为消息发送。属于动态调用的过程。在编译的时候并不能决定真正调用哪个函数(事实证明,在编译阶段,OC可以调用任何函数,即使这个函数并未实现,只要申明过就不会报错。而C语言在编译阶段就会报错。而C语言在编译阶段就会报错)。只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。


在下面的代码为例:


【obj makeText】;

其中obj是一个对象,makeText是一个函数名称。对于这样一个简单地调用。在编译时runtime会将上述代码转化成 obj_msgSend(obj.@selector(makeText));

首先,编译器将代码【obj makeText】;转化为obj_msgSend(obj,@selector(makeText));,在obj_msgSend函数中。首先通过obj的isa指针找到obj对应的class。在Class中先去cache中通过SEL查找对应函数method(猜测cache中method列表是以SEL为key通过hash表来存储的,这样能提高函数查找速度),若cache中未找到。再去methodList中查找,若methodlist中未找到,则取superClass中查找。若能找到,则将method加入到cache中,以方便下次查找,并通过method中的函数指针跳转到相应的函数中去执行。

你可能感兴趣的:(Runtime详解)