runtime是什么,顾名思义,可能有的人会说就是运行时,这么说也没错,可实际说来其实是Objective-C通过C/C++,汇编实现的一套API提供给OC实现运行时的功能。
OC的代码是从 代码--->编译连接--->执行的 在类的方法中即使没有实现这个方法,外部还是可以调用且不会出错,但是到实际运行时调用就会出错
对象的本质是结构体 方法的本质是objc_msgsend
runtime有三种调用方式 分别是:
1.runtime的API 例如 objc_方法
2.NSObject的API 例如 iskindofclass ismemberofclass
3.OC上层方法 @Selector
类方法存在元类对象地址中 实例方法存在在类对象地址中
类方法,元类方法 是什么形式存在呢 都是实例方法
对象--类 实例
类 --元类 实例
方法--转换成消息--先通过汇编快速查找IMP--
找不到再进行C的慢速查找
实例方法--递归--先找自己--找父类--找NSOBJECT--
找到了--放入cache中,方便下次查找
找不到进入动态方法解析
动态方法解析:
对象在收到无法解读的消息后,调用类方法+ (BOOL)resolveInstanceMethod:(SEL)sel来动态为其新增实例方法以处理该选择子。(如果尚未实现的方法是类方法,则调用+ (BOOL)resolveClassMethod:(SEL)sel)
动态方法解析的实质是 通过SEL查找IMP,只要实现方法resolveInstanceMethod,在方法中为SEL添加IMP后,系统会再次自动查找IMP,这样程序就能执行下去
实例方法动态方法解析在自己的类中resolveInstanceMethod方法动态解析,虽然类方法最终会走到resolveInstanceMethod,但是不能在自己的类中实现这个方法进行动态解析,它是需要在元类中查找个方法。所以可以在NSObJect里添加resolveInstanceMethod,一起拦截,处理,防止奔溃。
动态方法解析还是没找到会进入消息转发
1.快速转发
2.慢速转发
网友评论