先看一下OC当中类的继承关系
一个Instance(实例)通过 isa 指向class,然后class再通过 isa 指向metaclass。isa是一个struct,通过NSobject可一直往上找到它的定义,如图:
这个结构体中包含了指向元类的isa指针(注意跟super_class的区别);surper_class指向父类的指针;name类的名称;version类的版本;info类的标识信息;instance_size实例的大小;ivars成员变量地址;methodLists方法地址列表;cache缓存最近使用的方法地址;protocols协议列表。
一个object的isa指针会指向class,object中的isa结构体(注意我说的跟isa指针的区别,我说的isa指针和isa结构体不是一回事,isa结构体是上图的结构体)中应该不存储任何信息,只包含isa指针指向的class。
在一个class的isa结构体中会保存的信息有:
isa指针,指向元类(meta类);
super_class,指向父类;
name,自己的名字;
info,自己的信息;
instance_size,实例的大小;
ivars,自己成员变量的地址;
methodLists,-号方法的地址;
cache,obj_msgSend曾经通过这个class查询过的方法列表的缓存(方便下次调用时快速查找);
protocols,协议列表。
然后class的isa指针会指向一个metaclass类,这个类的isa结构体也包含了上面类似的信息,但methodLists应该保存的是+号方法,isa指针会指向nil。
由上的分析可以得出obj_msgSend的方法查找过程,如图:
由于isa结构体中存在一个cache缓存表,用来缓存obj_msgSend中查找过的方法,由此可见,obj_msgSend会首先查找这个cache,如果没有再进行上图的操作,然后将查找过的方法记录在cache中,这样下次查找会更快速。
obj_msgSend查找方法过程中涉及一个消息转发机制,具体可看这篇博文:
网友评论