美文网首页
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查找方法过程

    先看一下OC当中类的继承关系 一个Instance(实例)通过 isa 指向class,然后class再通过 is...

  • 方法慢速查找流程分析

    慢速查找前提 obj_msgsend消息发送在完成汇编缓存快速查找流程后,如果没有找到,说明缓存没有,那么就需要进...

  • iOS消息转发

    方法查找过程中,先通过sel查找imp,如果查找不到,则进入动态方法决议,看是否有特殊处理; 先判断cls是否元类...

  • runtime(二)--发消息和消息转发

    1. objc方法调用的过程大致分为两步: 从objc_msgSend()开始,查找方法过程,俗称发消息 如果方法...

  • 1.消息转发机制

    消息转发机制:当对象调用某个方法时,该方法没有实现,系统会通过消息转发来查找方法的实现。 下图为消息转发查找过程:...

  • load与initialize

    一、load load的方法调用是在加载类的时候,是通过函数的指针直接调用的,不是通过obj_msgSend消息发...

  • 重温数据结构_散列表/哈希表的查找

    基本概念 基于线性表、树表结构的查找方法,这类查找方法都是以关键字的比较为基础的。在查找过程中只考虑各元素关键字之...

  • iOS 消息转发流程

    runtime方法查找流程及消息转发 方法查找 方法查找的流程:缓存查找-->当前类查找-->父类逐级查找 1.缓...

  • 消息转发机制

    前言 在上一篇Runtime源码 方法调用的过程中我们了解了消息的响应过程,即 先缓存查找,若未找到 接下来查找本...

  • ruby中方法的调用——方法查找

    调用方法时,ruby会做两件事: 1、找到这个方法,这个过程称为方法查找 2、执行这个方法, 当前对象由self充...

网友评论

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

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