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

一 : 测试方法缓存

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


2012189-24d78a5886a7f035.png

扩容

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


2012189-148243b447850bfb.png

在散列取出想要的值

2012189-08555cb16b6f8b27.png

二 : objc_messageSend

值相同


2012189-2dcd2e2afdd08796.png

消息机制


2012189-85d6f32702983f3e.png

二 : 消息发送阶段

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

2012189-ede8a629197f715a.png

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

2012189-c506bb1e229b1397.png

三: 动态方法解析阶段

动态添加方法方式
添加other

方法( 1 )

2012189-b7c7e0fb774d3f2a.png

方法( 2 )

2012189-3dfa547ec17a4b1c.png

方法( 3 )

2012189-660feb79999d91e2.png

动态方法解析流程


2012189-1a9c535d8fc149bb.png

类方法添加方法


2012189-f242c34d6990123c.png

猜你喜欢

转载自blog.csdn.net/weixin_34122604/article/details/87649052
今日推荐