1.定义
首先,需要知道什么是runtime,runtime是基于C语言的一套API,C语言是基于面向过程的,而runtime在C的基础上进行了一次封装,使得C语言有了面向对象这一说。
2.工作原理
当我们向一个Objective-C对象发送消息时,runtime会根据实例对象的isa指针找到这个实例对象所属的类。那么runtime就会在这个类的方法列表里面以及父类的方法列表里面去寻找与之相关的一些方法,找到后,运行即可。
在objective-c中,消息直到运行时才绑定到方法实现上。编译器会将消息表达式[reveiver message]转化为一个消息函数的调用,即obj_msgSend,这个函数讲消息接收者和方法名作为其基础参数:obj_msgSend(receiver,selector),具体解释:通过接受者(receiver的isa指针)可判断是哪个具体的类(类的结构体),然后通过SEL在方法分发表里找到对应的IMP,通过IMP找到函数的地址即具体selector方法,即可运行。那么在查找的过程中,如果当前类没有selector,那么isa会指向起父类的结构体,以此类推。如果实在找不到,那么会走消息转发机制,下面,来了解下什么是消息转发机制。
3.消息转发机制
当一个对象无法接收到某一个消息时,会调用消息转发机制,通过这机制,可以在控制台告诉开发者具体报错信息。
消息转发机制分为:动态方法解析、备用接受者、完整转发。
在大概了解了runtime后,咱们具体来看下代码是如何实现的。
查看<objc/objc.h>
1.OC中的对象是一个objc_object类型的结构体
struct objc_object {
Class isa OBJC_ISA_AVAILABILITY;
};
id是一个objc_object类型的指针
typedef struct objc_object *id;
2.OC中的类是一个objc_class类型的结构体
struct objc_class{
Class isa OBJC_ISA_AVAILABILITY;
#if !__ OBJC2__
Class super_class
const char *name
long version
long info
long instance_size
struct objc_ivar_list
struct objc_method_list *methodLists
struct objc_cache *cache
struct objc_protocol_list *protocols
#endif
}OBJC2_UNAVAILABLE
3.isa是一个指向objc_class结构体的指针
(1)对于objc_object,其isa指向的是对象对应的类
(2)对于objc_class,其isa指向的是类对应的类-元类(metaclass)
网友评论