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

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

复习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、如果对应类的方法列表也没有找到,就从父类里面的方法列表查找,可一直找到基类里面看是否有该方法可以实现。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 30,068评论 8 265
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,896评论 0 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,909评论 1 32
  • 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的...
    西木阅读 30,798评论 33 466
  • 天津大剧院24、25日上演了史铁生中篇小说《关于一部以电影作舞台背景的戏剧之设想》改编的话剧《酗酒者莫非》...
    梁浩骞阅读 5,688评论 0 0

友情链接更多精彩内容