runtime 理解

2019-12-11  本文已影响0人  kennths

   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.慢速转发

上一篇下一篇

猜你喜欢

热点阅读