美文网首页
iOS Runtime

iOS Runtime

作者: 爱吃麦子的鱼 | 来源:发表于2020-05-27 23:13 被阅读0次

    Runtime背景

    OC是基于C的一门面向对象的语言,C语言是一门面向过程的语言,面向对象的实现是通过C语言的一套API,runtime运行时实现的。runtime的核心是消息传递。

    对象的结构

    想要了解消息传递机制,需要先了解OC对象的结构。

    OC对象的分类
    • instance(实例对象)

    主要存储成员变量的具体值

    • class(类对象)

    存储类的协议、属性、成员变量、实例方法

    • meta_class(元类对象)

    主要存储类方法

    OC对象的结构
    • 类对象的数据结构


      struct objc_class的结构.png
    • 实例对象、类对象、元类对象之间的关系


      OC对象结构.png

      在64bit之后,isa指针需要进行一次位运算才能计算出真实的地址。

    isa、superclass总结
    isa superClass.png

    通过上图我们可以看出整个体系构成了一个自闭环。struct objc_object结构体实例它的isa指针指向类对象,类对象的isa指针指向了元类。super_class指针指向了父类的类对象。元类的super_class指针指向了父类的元类,那元类的isa指针又指向了自己。

    instance调用对象方法的轨迹
    isa找到class,方法不存在,就通过superclass找父类

    class调用类方法的轨迹
    isa找meta-class,方法不存在,就通过superclass找父类

    Runtime消息传递

    方法调用三个阶段
    1、 消息发送:负责从类及父类的缓存列表及方法列表查找方法。
    2、 动态解析:如果消息发送阶段没有找到方法,则会进入动态解析阶段,负责动态的添加方法实现。
    3、 消息转发:如果也没有实现动态解析方法,则会进行消息转发阶段,将消息转发给可以处理消息的接受者来处理。

    消息发送
    消息发送.png
    动态解析
    动态解析.png
    消息转发
    消息转发.png

    Runtime应用

    • 利用关联对象(AssociatedObject)给分类添加属性
    • 遍历类的所有成员变量(修改textfield的占位文字颜色、字典转模型、自动归档解档)
    • 交换方法实现(交换系统的方法)
    • 利用消息转发机制解决方法找不到的异常问题

    相关文章

      网友评论

          本文标题:iOS Runtime

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