RunTime

作者: J星O海E | 来源:发表于2021-06-30 01:21 被阅读0次

    Runtime是什么,平时有哪些应用。

    OC是一门动态性比较强的编程语言,允许很多操作推迟到程序运行时再进行。OC的动态性就是由Runtime来支撑和实现的,Runtime是一套C语言的API,封装了很多动态性相关的函数。平时编写的OC代码,底层都是转换成了Runtime API进行调用

    应用

    1、利用关联对象(AssociatedObject)给分类添加属性。

    2、hook方法-MethodSwizzling。

    消息传递

    1、调用方法之前,先去查找缓存,看看缓存中是否有对应选择器的方法实现,如果有,就去调用函数,完成消息传递(缓存查找:给定值SEL,目标是查找对应bucket_t中的IMP,哈希查找)

    2、如果缓存中没有,会根据当前实例的isa指针查找当前类对象的方法列表,看看是否有同样名称的方法 ,如果找到,就去调用函数,完成消息传递(当前类中查找:对于已排序好的方法列表,采用二分查找,对于没有排序好的列表,采用一般遍历)

    3、如果当前类对象的方法列表没有,就会逐级父类方法列表中查找,如果找到,就去调用函数,完成消息传递(父类逐级查找:先判断父类是否为nil,为nil则结束,否则就继续进行缓存查找-->当前类查找-->父类逐级查找的流程)

    如果一直查到根类依然没有查找到,则进入到消息转发流程中,完成消息传递

    消息转发

    动态方法解析 :  + (BOOL)resolveInstanceMethod:(SEL)sel

    class_addMethod([selfclass], sel, (IMP)test2,"v@:");

    备用接收者: - (id)forwardingTargetForSelector:(SEL)aSelector

    完整消息转发:首先它会发送-methodSignatureForSelector:消息获得函数的参数和返回值类型。如果-methodSignatureForSelector:返回nil ,Runtime则会发出 -doesNotRecognizeSelector: 消息,程序这时也就挂掉了。如果返回了一个函数签名,Runtime就会创建一个NSInvocation 对象并发送 -forwardInvocation:消息给目标对象。

    - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector

    - (void)forwardInvocation:(NSInvocation*)anInvocation

    weak

    runtime对注册的类会进行布局,对于weak修饰的对象会放入一个hash表中。用weak指向的对象内存地址作为key,当此对象的引用计数为0的时候会dealloc,假如weak指向的对象内存地址是a,那么就会以a为键在这个weak表中搜索,找到所有以a为键的weak对象,从而设置为nil。

    参考文档:

    https://www.jianshu.com/p/19953fa658c2

    相关文章

      网友评论

          本文标题:RunTime

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