美文网首页
runtime 理解

runtime 理解

作者: kennths | 来源:发表于2019-12-11 14:47 被阅读0次

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

    相关文章

      网友评论

          本文标题:runtime 理解

          本文链接:https://www.haomeiwen.com/subject/ojhzpqtx.html