美文网首页
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