runtime

作者: 不如养花 | 来源:发表于2020-04-22 09:34 被阅读0次

    Runtime

    什么是Runtime
    • OC是一门动态性比较强的编程语言,允许很多操作推迟到程序运行时再进行
    • OC的动态性就是由Runtime来支撑和实现的,Runtime是一套C语言的API,封装了很多动态性相关的函数
    • 平时编写的OC代码,底层都是转换成了Runtime API进行调用
    具体应用
    • 利用关联对象给分类添加属性
    • 遍历类的所有成员变量(字典转模型,自动归档解档)
    • 交换方法实现(交换系统方法)
    • 利用消息转发机制解决方法找不到的异常问题
    weak实现原理
    super的本质
    • self还是super真正调用的对象都是一样的,只是查找方法的位置不一样,self是从当前类结构中开始查找,super是从父类中查找,但方法真正的接受者都是当前类或者当前类的对象

    • [self message]:会转化为objc_msgSend(id self,SEL _cmd)这个函数,在当前类结构中找到方法并且调用

    • [super message]:
      super调用,底层会转换为objc_msgSendSuper2函数的调用,接收2个参数:struct objc_super2,SEL


      image.png

    receiver是消息接收者
    current_class是receiver的Class对象

    Runtime如何实现weak属性
    • weak 关键字的作用弱引用,所引用对象的计数器不会加一,并在引用对象被释放的时候自动被设置为 nil。
    • runtime对注册的类,会进行布局,会将weak对象放入一个hash表中,用weak指向的对象的内存地址作为key,当此对象的引用计数为0的时候会调用对象的dealloc方法,假设指向的对象的内存地址是a,那么会以a为key,在这个weak hash表中搜索,找到所有以a为key的weak对象,从而设置为nil。
    • weak表其实是一个哈希表,key是所指对象的指针,value是weak指针的地址数组。(value是数组的原因是:因为一个对象可能被多个弱引用指针指向)
    • Runtime维护了一张weak表,用来存储某个对象的所有的weak指针。

    isa指针

    arm64之前,普通指针
    arm64之后,共用体(union)结构,使用位域存储更多的信息

    相关文章

      网友评论

          本文标题:runtime

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