美文网首页
Runtime之数据结构

Runtime之数据结构

作者: 一点也不呆 | 来源:发表于2019-08-26 13:29 被阅读0次
  1. objc_object:实际上我们创建的所有对象(id)对应的数据都是objc_object这个结构体, 这个结构体的成员变量有哪些呢?

    • isa_t:实际上是C++当中的共用体,主要作用就是寻址 也就是指针, objc_object 实例对象通过isa_t获取对应的类对象,类对象通过isa_t获取对应的元类对象. 共用体无论在32位架构上还是在64位架构上都是由32个0或1组成,或者64个0或1组成,isa 又分成两种类型一种叫指针类型:isa的值就是代表目标的地址,另一种叫非指针类型:isa部分的值代表目标的地址,以64位为例上图 isa_t.png isa的指向:如果是一个实例对象那么isa指向的是类对象,如果是一个类对象那么它isa指向的就是元类对象 isa指向.png
    • 弱引用相关:比如说标记一个对象,它曾经是否有过弱引用指针
    • 关联对象相关:比如说给一个对象设置了一些关联属性
    • 内存管理相关:比如MRC下的release, retain ARC和MRC下都用的@autoreleasepool 等这些方法的实现其实都是封装在objc_object这个结构体当中.上个图. objc_object.png
  2. objc_class:我们创建的所有类(class)对应的数据结构都是objec_class这个结构体, 而且有意思的事这个结构体继承于objc_object这个结构体,所以如果有人问你class这个类是不是一个对象,你可以整理一下发型,斜视45度, 跟他说YES!,这叫类对象.那么它有哪些成员变量呢?先上个图 objc_class.png
    • Class superclass: 类与父类的关系,就是通过Class superclass这个成员变量来定义的

    • cache_t cache:它表达方法缓存的一个数据结构,在消息传递的时候就会使用这个数据结构,也是可增量扩展的哈希表结构,用哈希表结构主要提高查找效率,cache_t可以理解成是由无数个bucket_t元素组成的数组,每个bucket_t又是一个结构体, bucket_t这个结构体的成员变量有两个一个是 key 对应我们oc中的@selector 选择器 我们可以通过一个方法的具体名称(name),来寻找它的具体实现(IMP),另一个成员变量就是IMP,IMP可以理解为是一个无类型的函数指针,这样的话如果给你一个key(方法选择器), 你就可以通过哈希算法来定位这个key对应的bucket_t位于cache_t这个数组中的哪个位置, 然后再根据这个bucket_t找到对应的IMP cache_t.png
    • class_data_bits_t bits:实际上我们定义一个类的变量 属性 方法都在bits 这个成员变量中,它主要是对class_rw_t(rw-->readwrite)的进一步封装, class_rw_t代表的是类相关的读写信息,是对class_ro_t(ro-->readonly)的进一步封装,这里重点说一下class_rw_t,这个结构体的成员变量有4个class_ro_t ,protocols(协议) , properties (属性),methods(方法),后三个成员变量都是由二维数组(list_array_tt)组成,二维数组:简单解释就是现在有个数组A 里面有很多个元素B , 而且这个元素B本身也是一个数组, 后三个成员变量就存在这个数组里,作为元素.见下图 class_rw_t 下午2.58.08.png
      而class_ro_t的成员变量 有name(类名), ivars(类的成员变量), ,protocols(协议) , properties(属性) ,methodLists(方法列表) 跟class_rw_t不同的是:后四个成员变量是一位数组如下图 class_ro_t.png
      再来说说method_t:它实际上就是对函数四要素(名称, 返回值, 参数, 函数体)的封装,它的成员变量有 SEL name 对应函数的名称 consts char * types 对应函数的参数和返回值,IMP对应函数的函数体,那这里types为什么会同时对应函数的参数和返回值呢 ,那就得扩展一下啦,这里用到了苹果的Type encodings 这个技术, 直接上图 Type encodings.png 从图中我们可以看到 -(void)aMethod: 这个方法对应的types值为v@: 这个"v" 就表示函数的返回类型对应图中的返回值,"@"表示接受对象为参数1 ":"表示是一个方法选择器为参数2
      最后上个runtime整体数据结构图 结构总图.png
      关于runtime的数据结构就先写到这啦,本人小白一个希望路过的给个赞和建议!

相关文章

网友评论

      本文标题:Runtime之数据结构

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