美文网首页
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