1.id的本质是什么?
说到id 就是跟SEL一样 id也被定义在Objc/objc.h目录下
typedef struct objc_object*id
说到id它是一个结构体指针类型,它可以指向Objective-C的中的任何对象.objc_object结构体
struct objc_object{Class isa OBJC_ISA_AVAILABILITY}
我们通常说的对象,就是长这个样子,这个结构体只有一个成员变量isa ,对象可以通过isa指针找到其所属的类,isa指针是一个class类型的成员变量.
说到class也是一个结构体指针类型
它的原型是这样的typedef struct objc_class *Class
class 也有一个isa指针,指向所属的元类(meta).
super _class 是指向超类
name: 是类名
version 是类的版本信息
info 是类的详情
instance_size 是指的该类的实例对象的大小
dinars指向该类的成员变量列表
methodLists: 指向该类的实例方法列表,它将方法选择器和方法实现地址联系起来,methodlists是指向objc_mthod_list指针的指针,也就是说可以动态的修改*methdLists 的值来添加成员方法,这也就是分类可以增加方法不可增加属性的原因了.
cache: Runtime系统会把调用的方法存到cache中(理论上将一个方法如果被调用者,那么它有可能今后还会被调用),下次查找的时候效率更高
protocols:指向该类的协议列表
也就是当我们调用一个方法时,其运行过程大致如下:
Rumtime系统会把方法调换转化为方法发送,就objc_megSend,并且把方法的调用者,和方法选择器,当做参数传递过去.
此时,方法的调用者会通过isa指针来找到其所属的类,然后在cache或者methodLists中查找该方法,找得到就会跳到对应的方法去执行.
如果在类中没有找到该方法,就会去super_calss父类里面找,一直找到NSObjc.没有找到就报错
内容参考自objc中国