obj_msgSend查找方法过程

2016-06-14  本文已影响161人  酸菜Amour

先看一下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查找方法过程中涉及一个消息转发机制,具体可看这篇博文:

www.henishuo.com/runtime-message-forwarding/

上一篇下一篇

猜你喜欢

热点阅读