美文网首页
Runtime笔记三:Runtime发送消息的流程

Runtime笔记三:Runtime发送消息的流程

作者: 蔚尼 | 来源:发表于2018-05-29 14:25 被阅读4次

    我们调用方法的时候,其实就是在发送消息,那这个消息发送的流程是什么样子的呢。

    复习isa指针

    首先,复习isa指针。

    • 创建对象时,分配内存的同时,isa指针也随之创建;
    • 发送消息时(执行方法时),isa指向谁,就在谁的方法列表里面查找要执行的方法;
    • 发送消息给一个对象时,isa指针指向这个对象所属的类,会在所属类和父类的方法列表里面查找要执行的方法;
    • 发送消息给一个类时,isa指针指向这个类的元类,元类里面包含了所有的类方法。就会在元类(meta-class)的方法列表里面查找要执行的方法。
      eg:[NSArray array];就是在给NSArray发送消息,在NSArray的元类里面查找要执行的方法。
    • 发送消息给一个元类(meta-class),所有元类的isa指针都指向NSObject(基类)的元类,而NSObject的isa指针指向自己。形成了一个闭环。

    流程

    调用方法/发送消息,就是调用

      objc_msgSend(receiver, selector, arg1, arg2, ...)
      //  receiver:消息接受者
      // selector:调用的方法
      // arg:参数
    

    方法被调用后,会被放到缓存里面,下次再调用该方法的时候直接从缓存里面读取,提高效率。首先我们看存缓存读取的流程:

    当方法已放入缓存

    从缓存读取方法

    当方法未放入缓存

    从所在类读取方法

    总结:
    objc_sendMsg发送消息流程:
    1、根据接收对象的isa指针,找到接收对象所在类的方法缓存。
    2、从方法缓存里面查看是否有要执行的这个方法,有则从缓存读取该方法进行执行。
    3、缓存里面没有,就根据isa指针找到所属类对应的方法列表,从方法列表里面找到对应的实现。实现后把方法加入缓存。
    4、如果对应类的方法列表也没有找到,就从父类里面的方法列表查找,可一直找到基类里面看是否有该方法可以实现。

    如果一直未找到方法的实现,就会进行消息转发,下一篇文章就来记录如何进行的消息转发。

    相关文章

      网友评论

          本文标题:Runtime笔记三:Runtime发送消息的流程

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