知识点

iOS的基础数据结构

2021-07-24  本文已影响0人  宋唐不送糖

整体Runtime数据结构

Runtime基础数据结构如下 : objc_object、objc_class、isa指针、method_t

objc_object

即id类型(我们平时用的所有对象都是id类型的,在runtime中,id 就是 objc_object结构体)

objc_object结构体主要包含:
1.isa_t:共用体。
2.关于isa操作相关的一些方法:通过objc_object结构体,来获取isa所指向的类对象,或者通过类对象的isa指针获取它的元类对象一些遍历的放大。
3.弱引用相关:标记一个对象是否曾经有过弱引用指针。
4.关联对象相关方法:我们为对象设置了关联属性,关于关联属性的一些相关方法也体现在objc_object结构体中。
5.内存管理相关的方法实现:MRC下经常用到的runtain,release等方法实现 ,以上均封装在objc_object结构体中。

objc_class

OC中的Class,代表一个类,他在runtime中对应objc_class的数据结构(结构体)。
objc_class继承objc_object
所以Class这样一个类也是一个对象,称为类对象,因为它继承自objc_object。


objc_class包含:
1.objc_class拥有一个superClass指针,指向class类型,(如果说Class是一个类对应的话,superClass指针指向的就是它的父类对象,就是我们平时说的类与父类,实际上是通过objc_class中superClass成员变量来定义的)。
2.cache_t cache成员变量: 方法缓存结构,消息传递时会使用这样的数据结构。
3.class_data_bits_t bits数据结构: 关于类所定义的变量,属性,方法都在bits这样一个成员结构中。

isa指针

它是C++中的共用体,在OC中名称是isa_t
不论是64位架构上(或者32位架构)上面,共用体是64个(或者32个) 0或者1的数字 (按大多数64位分析)

分两种类型(isa指针是什么含义的时候):

1.指针型isa: 64位的0或者1的整体内容代表所指向的Class的地址,也就是可以通过isa的内容来获得类对象的地址。
2.非指针型isa: isa的值得部分代表Class的地址,之所以这样是因为我们在寻址过程中,只有三四十位数就可以保证我们寻找到所有Class地址了,多出来的位可以用来存储其他相关内容,来达到节省内存的目的。
isa的指向:

关于对象,它指向类对象
例如我们拥有一个实例,实例就是OC中对应的id类型,在Runtime中就是objc_object,里面有个isa指针,会指向它对应的Class。

关于类对象,指向元类对象
class因为集成objc_object,所以里面也有isa指针,指向其元类对象。

当我们进行方法调用时,调用一个实例的实例方法,实际上是通过isa指针,到它的类对象中,去进行方法查找。
如果我们调用的是类方法,那么是通过类对象的isa指针,到它的元类对象中去查找。

cache_t

cache_t具体数据结构说明:


可以理解为是数组来实现的

假如现在有个key,可以通过哈希查找算法来定位当前key所对应的bucket_t位于数组当中哪个位置,然后从这个位置中提取出bucket_t中的IMP

class_data_bits_t

这个结构是objc_class中的成员结构

class_rw_t

包含
1.class_ro_t
2.protocols类分类中的协议
3.properties类分类中的属性
4.methods类分类中的方法
这三个数据结构是个二维数组

假如我们三个分类A、B、C,编译顺序A->B->C。这时会逆序遍历并打包成分类数组,分类C中的所有方法都在第一列竖列表中,存在二维数组的第1项。分类B中的所有方法都在第二列竖列表中,存在二维数组的第2项。分类A中的所有方法都在第三列竖列表中,存在二维数组的第3项。

     [[method_t,method_t],  [method_t], [method_t,method_t,method_t]]
       -------------------   ----------  -----------------------------
      分类C中的方法列表           B                   A

class_ro_t

1.name:类名
2.ivars:声明的类的成员变量
3.类的属性
4.类的协议
5.类的方法列表
除1外都是一维数组
在方法列表当中存储的内容,一般是分类中添加的方法
method_t实际上是对方法的抽象说明

method_t

method_t是对函数四要素(名称、返回值、参数、函数体)的封装
函数四要素决定了函数的唯一性

method_t是个结构体,主要有三个数据类型
1.name 函数名称
2.types 函数返回值和参数的集合
3.imp 无类型的函数指针,对应着函数体

types是如何表示返回值和参数的

苹果的Type Encodings技术
types成员属性,实际上表达结构是:
第一个位置永远是函数的返回值类型,后面跟着每个参数的参数类型
参数可以有多个,返回值只有一个
V@:代表types所存储的内容
V对应返回值,@对应参数1,:对应参数2

上一篇 下一篇

猜你喜欢

热点阅读