美文网首页iOS Kit
RunTime 基础数据结构

RunTime 基础数据结构

作者: 某非著名程序员 | 来源:发表于2021-01-19 23:10 被阅读0次

    1.源码

    RunTime源码阅读(一)之weak
    RunTime源码阅读(二)关联对象
    RunTime源码阅读(三)dealloc的释放
    RunTime源码阅读(四)内存管理
    RunTime源码阅读(五)之category原理
    RunTime源码阅读(六)之消息查找
    RunTime源码阅读(七)之load加载原理
    RunTime源码阅读(八)之autoreleasepool
    RunTime源码阅读(九)之isa指针,类,元类
    RunTime源码阅读(十)之方法交换原理
    RunTime源码阅读(十一)之方法添加原理
    iOS 实例方法和类方法中的self与self.class有什么区别?
    iOS 多个category同时交换同一个方法

    2.基本数据结构

    2.1objc_object

    id = objc_object:isa_t

    • isa_t
    • 关于isa操作相关
    • 弱引用
    • 关联对象
    • 内存管理

    2.2objc_class

    class=objc_class继承自objc_object

    • Class superClass
    • cache_t cache
    • class_data_bits_t bits

    2.3isa指针

    1. 共用体isa_t
    • 指针型isa:值代表Class的地址
    • 非指针型isa:部分代表Class的地址
    1. isa指向
      实例对象的isa指向类对象,类对象的isa指向元类

    2.4cache_t

    • 用于快速查找方法执行函数
    • 是可增量扩展的哈希表结构
    • 是局部性原理的最佳应用
      cache_t是一个数组,数组元素是bucket_t(key IMP)

    2.5class_data_bits_t

    • 主要是对class_rw_t的封装
    • class_rw_t代表了类相关的读写信息、对class_ro_t的封装
    • class_ro_t代表了类相关的只读信息


      class_rw_t.png

    2.6class_ro_t

    class_ro_t.png

    2.7 method_t

    method_t.png
    Type Encoding.png

    2.8整体数据结构

    整体数据结构.png

    3.实例对象、类对象、元类对象

    1. 类对象:存储实例方法等列表信息
      元类对象:存储类对象的实例方法等列表信息
    2. 区别
      实例对象通过 isa 指针找到类对象,类对象通过 isa 指针找到元类对象。
      类对象和元类对象都是 objc_class 结构,继承自 objc_object。才有 isa 指针,才能实现。
    isa指向.png
    1. NSStringFromClass([self class]));
      NSStringFromClass([super class]);
      输出的结果是什么?为什么?
      [self class]->objc_msgSend(self,@selector(class))
      [super class]->objc_msgSendSuper(super,@select(class))
      struct objc_super结构体中id receiver;指向当前实例对象的

    4.消息传递

    1. cache_getImp缓存查找,汇编实现
    2. getMethodNoSuper_nolock:当前类查找
    • 根据IsFixedUp区分是否已经排序,已经排序的用二分查找,否则用一般遍历查找
    1. 父类查找:superclass逐级父类查找
    2. _class_resolveMethod根据是否是元类,进行添加实例方法还是类方法

    5.方法缓存

    采用哈希查找:利用cache_key_t找到对应的bucket_t
    key:sel value:bucket_t中的imp

    6.消息转发、动态添加方法

    消息转发.png
    1. _class_resolveMethod动态添加方法
    • 添加实例方法
      resolveInstanceMethod-class_getInstanceMethod-class_addMethod
    • 添加类方法
      resolveClassMethod-class_getClassMethod-class_addMethod
    1. 快速消息转发 forwardingTargetForSelector:
      给其他对象执行
    2. 标准消息转发
      方法签名:methodSignatureForSelector
      处理方法前面:forwardInvocation
      doesNotRecognizeSelector

    7.Method-Swizzling

    1. 方法交换:分类中对同一个方法进行交换会发生什么?
    2. AOP切面编程:直接交换的风险
      多线程交换不安全、方法交换名冲突
    3. 不侵入业务代码:如方法耗时统计,统计业务时长
    4. 为系统方法添加扩展功能

    8.动态方法解析

    @dynamic

    • 动态运行时语言将函数决议推迟到运行时。
      setter、getter在调用时动态生成。赖加载
    • 编译时语言在编译期进行函数决议
    • 编译后是无法修改方法。

    相关文章

      网友评论

        本文标题:RunTime 基础数据结构

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