iOS Kit

RunTime 基础数据结构

2021-01-19  本文已影响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

2.2objc_class

class=objc_class继承自objc_object

2.3isa指针

  1. 共用体isa_t
  1. isa指向
    实例对象的isa指向类对象,类对象的isa指向元类

2.4cache_t

2.5class_data_bits_t

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:当前类查找
  1. 父类查找:superclass逐级父类查找
  2. _class_resolveMethod根据是否是元类,进行添加实例方法还是类方法

5.方法缓存

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

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

消息转发.png
  1. _class_resolveMethod动态添加方法
  1. 快速消息转发 forwardingTargetForSelector:
    给其他对象执行
  2. 标准消息转发
    方法签名:methodSignatureForSelector
    处理方法前面:forwardInvocation
    doesNotRecognizeSelector

7.Method-Swizzling

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

8.动态方法解析

@dynamic

上一篇 下一篇

猜你喜欢

热点阅读