一 : 测试方法缓存
对象调用某个方法的时,会去类对象方法列表中查找,找到以后候会缓存到其散列表中,假如没找到则去父类的类对象中查找,此时找到之后依然将方法存储在此对象的类方法中散列表中.
下面断点打印中,散列表显示第一个缓存,假如没有也不要意外,因为散列表的存放算法不确定放在哪个位置.
扩容
当mask感觉不够用的时候就会自动扩容, occupied = 1 是因为重新扩容后 缓存清空,重新缓存
在散列取出想要的值
二 : objc_messageSend
值相同
消息机制
二 : 消息发送阶段
objc_msgSend如果找不到合适的方法进行调用,会报错unrecognized selector sent to instance
源码执行顺序,先去缓存找,找不到再遍历(二分法遍历)方法列表,找到了再次存入缓存里,如果没有找到则去父类缓存中查找,如果找到了存入当前类对象缓存中,如果父类缓存中没有,则在父类的方法列表中查找,找到则放入当前类缓存中,如果还父类的方法列表中还没有则继续查找父类的父类,直到都找不到了,则进入动态方法解析阶段
三: 动态方法解析阶段
动态添加方法方式
添加other
方法( 1 )
方法( 2 )
方法( 3 )
动态方法解析流程
类方法添加方法