OC源码分析-Runtime源码分析(三)

一 : 测试方法缓存

对象调用某个方法的时,会去类对象方法列表中查找,找到以后候会缓存到其散列表中,假如没找到则去父类的类对象中查找,此时找到之后依然将方法存储在此对象的类方法中散列表中.
下面断点打印中,散列表显示第一个缓存,假如没有也不要意外,因为散列表的存放算法不确定放在哪个位置.


扩容

当mask感觉不够用的时候就会自动扩容, occupied = 1 是因为重新扩容后 缓存清空,重新缓存


在散列取出想要的值

二 : objc_messageSend

值相同


消息机制


二 : 消息发送阶段

objc_msgSend如果找不到合适的方法进行调用,会报错unrecognized selector sent to instance

源码执行顺序,先去缓存找,找不到再遍历(二分法遍历)方法列表,找到了再次存入缓存里,如果没有找到则去父类缓存中查找,如果找到了存入当前类对象缓存中,如果父类缓存中没有,则在父类的方法列表中查找,找到则放入当前类缓存中,如果还父类的方法列表中还没有则继续查找父类的父类,直到都找不到了,则进入动态方法解析阶段

三: 动态方法解析阶段

动态添加方法方式
添加other

方法( 1 )

方法( 2 )

方法( 3 )

动态方法解析流程


类方法添加方法


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,798评论 1 32
  • runtime 介绍 Objective-C 是一门动态性比较强的编程语言,跟 C、C++ 等语言有着很大的不同,...
    666真666阅读 4,492评论 0 3
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,820评论 0 9
  • 1.理解NSObject和元类 1.1 在OC中的对象和类是什么 对象是在objc.h中定义的 类是在runtim...
    HWenj阅读 4,427评论 0 3
  • 没有鞭炮和礼花,隔壁的娱乐场所也都歇业了,待在家里感觉除夕夜异常宁静。 下午在奶奶家陪她玩玩麻将,请注意,不是打哦...
    早安5点55阅读 695评论 0 0