runtime 分类结构体_iOS探索:Runtime之基本数据结构

objc_object

国际惯例,流程图 算法

首先平时咱们所使用的对象都是id类型的,id对应到runtime中就是objc_object这样的一个结构体,在这个结构体当中主要包含如下几个部分:数组

一、第一部分是isa_t,实际上呢isa_t是一个共用体缓存

二、在objc_object中还包含了关于isa操做相关的方法,好比说经过objc_object这个结构体来获取isa所指向的类对象,经过类对象的isa指针获取它的元类对象数据结构

三、还包含了一些弱引用相关的一些方法,好比说标记一个对象它是否有过弱引用指针架构

四、还有关于关联对象的一些方法,好比说为一个对象咱们设置一些关联属性,关于关联属性的一些方法也体如今objc_object这个结构体中函数

五、最后还包括内存管理相关的一些方法,好比说咱们再MRC下常用到的retain和relese方法,包括MRC和ARC下面均可以用到的autorelesepool(自动释放池),这些关于内存管理相关的方法都是封装在objc_object这个结构体中3d

objc_class

咱们在OC语言中所使用的Class,表明的是一个类,在runtime中对应的是objc_class这样一个结构体,它继承自objc_object,那么问题来了:Class这样一个类,它是不是一个对象呢?答案固然是确定的,咱们称之为类对象,由于它继承自objc_object指针

在objc_class这个结构体中,包含superClass这样一个指针,它指向的也是一个Class,例如:若是这个Class是一个类对象,那么它的superClass指针指向的事它的父类对象,一个类对象与它的父类对象也正是经过这个superClass指针来创建起联系cdn

接下来它还包含一个cache_t这样一个成员变量,cache_t它表达了方法缓存的一个结构,咱们在进行消息传递的时候会使用到对于方法缓存的这样一个数据结构对象

第三个是关于class_data_bits_t这样的一个数据结构,实际上咱们对于一个类所定义的变量,属性,包括它的一些方法都在bits这样一个数据结构当中

isa指针

共用体isa_t

isa的结构主要是C++中的共用体,咱们在OC当中其实是定义成了一个isa_t这样一个名称,对于一个共用体来讲,不论它是在64位架构仍是在32位架构上面,它实际上都是32个0或者1的数字(或者64个0或者1的数字)

isa指针主要分为两种:一种是指针型isa,另外一种是非指针型isa

指针型isa:isa的值表明的是Class的地址,也就是64个(或者32,看架构)0或者1它的总体内容所表明的是所指向的Class的地址

非指针型isa:isa的值的部分表明的是Class的地址,好比说针对64位架构来讲,可能对应的是某一部分33位或者44位所表明的值,并非整个64位都表明,这样作的一个目的是咱们在寻址过程当中只有三四十位的位数就能够保证咱们找到全部Class的地址,多出来的这些位能够用来保存其余的内容,达到节省内存的目的

isa的指向

关于对象,isa指向的是其类对象

关于类对象,isa指向的是其元类对象

cache_t

用于快速查找方法执行函数 例如咱们在调用一个方法的时候,若是这个方法已经缓存,咱们就不用去其对应的方法列表中遍历查找,从而节省时间

可增量扩展的哈希表结构 增量扩展体如今当咱们这个结构存储量在扩大的时候会它也会逐渐的扩大它的内存结构用哈希表来实现也是为了提升查找效率

局部性原理的最佳应用 例如咱们在调用方法的时候,其实每次调用的都是某几个方法,若是把这些调用频率较高的方法放到方法缓存中,那么下次调用的命中就会更高

cache_t其实能够理解为一个数组来实现的,数组当中都是bucket_t这样的一个结构体来封装的

对于bucket_t它有两个重要的成员变量,一个是key,一个是IMP,对于key其实是OC语言中的selector,在调用一个方法的时候它其实是一个选择器SEL,对应的就是这里面的key,咱们能够经过一个方法选择器的名称来寻找一个方法的具体实现。IMP咱们能够理解为一个无类型的函数指针

好比说如今咱们拿到一个key,咱们能够经过哈希查找算法来定位当前这个key所对应的bucket_t这个结构体位于数组中的哪一个位置,咱们定位到这个位置后咱们就能够提取其中的IMP指针指向的具体函数实现来调用这个函数

class_data_bits_t

class_data_bits_t主要是对class_rw_t的封装

class_rw_t表明了类相关的读写信息(好比说咱们给类添加的分类中的一些方法,或者属性以及协议)、对class_ro_t的封装

class_ro_t表明了类相关的只读信息

class_rw_t

class_rw_t主要包含class_ro_t、protocols(协议)、properties(属性)、methods(方法列表),对于协议,属性和方法列表的数据结构是二维数组

class_ro_t

class_ro_t主要包含name(名字)、ivars(成员变量)、protocols(协议)、properties(属性)、methodList(方法列表),对于成员变量、协议、属性和方法列表的数据结构是一维数组,与class_rw_t的区别在:在class_rw_t中通常存放的是分类的一些内容,而在class_ro_t中通常存放类原始的一些内容和信息(我的理解)

method_t

method_t是一个结构体类型,主要包括SEL类型的name(方法的名称)、types(对应的是函数的返回值和参数的组合)、IMP类型的imp(无类型的函数指针,对应函数体)

Type Encodings

const char* types是一个不可变得字符指针,它的组成结构如上图所示,首先第一位是返回值,后面是参数,**为啥第一位置是返回值呢?**由于咱们定义一个函数的时候,函数的参数能够有多个,可是返回值只能有一个,若是没有返回值,那么返回值的类型能够用void来修饰,因此返回值占据types中的第一个位置

举个栗子,例如在OC中- (void)aMethod;这个方法,它的返回值是void类型的,没有参数,它对应的types就是v@:

首先v对应的事返回值(void类型),@对应的是参数1(id类型),:对应的事参数2(SEL),这个解释一下:当咱们调用一个方法或者说是方法消息传递时到runtime层面会转化成调用objc_msgSend方法,这个函数中的第一个参数和第二个参数是不可变的(固定的),第一个参数必须是id类型的,及消息的接受者(self),第二个参数表示是一个选择器,因此用这样一个字符串来表示

总体数据结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值