美文网首页
obj_msgSend查找方法过程

obj_msgSend查找方法过程

作者: 酸菜Amour | 来源:发表于2016-06-14 15:01 被阅读161次

    先看一下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/

    相关文章

      网友评论

          本文标题:obj_msgSend查找方法过程

          本文链接:https://www.haomeiwen.com/subject/jzrudttx.html