美文网首页
Runtime - 窥探struct objc_class结构

Runtime - 窥探struct objc_class结构

作者: xxttw | 来源:发表于2023-06-07 16:51 被阅读0次

objc_ class 结构体

image.png
  • isa
  • superclass
  • cache_t chche 方法缓存
  • class_data_bits_t bits /ˈbɪts/ 用于获取具体的类信息

class_rw_t

分类中添加的方法协议等信息 会在运行时合并到rw_t数据结构中


image.png
  • 方法列表 methods
  • 属性列表 properties
  • 协议列表 protocols
  • class_ro_t *ro 包含了类的初始化信息放到这里

class_ro_t

ro_t中存放着类 初始定义的相关信息 这个结构是只读的, 这也意味着我们无法使用分类为已经存在的类添加成员变量和属性


image.png

1.方法列表 baseMethodlist
2.协议列表 baseProtocols
3.成员变量列表 ivars
4.属性列表 baseProperties


method_t

image.png
  • SEL name 函数名
  • char *type 编码类型(返回值类型, 参数类型)
  • IMP imp 函数地址

cache_t

image.png
  • struct bucket_t *buckets 散列表也叫哈希表
  • mask 散列表的长度-1
  • occupied 已缓存的方法数量

散列表查找缓存的原理

首先buckets散列表 其实就是一个数组, 也会有索引和索引对应的数据
方法存储时, 通过 方法名 & mask 算出一个索引值, 直接存入散列表
查找方法时 通过方法名@selector@(personTest) & mask(散列表的长度-1)计算出一个索引, buckets[索引] 直接取出缓存对象, 获得imp 函数地址 直接调用, 这种方式查询方法效率就会特别高
这种方法就是牺牲一定的内存空间来换取执行效率

  • 如果有两个方法计算出的索引都是同一个,第二个方法的索引底层会自动-1, 直到找到不重复的空位位置
    查找方法的时候, 发现索引和key不一样, 也会自动-1 开始查询, 也是直到找到相同的key为止


    image.png

相关文章

网友评论

      本文标题:Runtime - 窥探struct objc_class结构

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