Runtime数据结构详解

栏目: IT技术 · 发布时间: 4年前

内容简介:我们先看Runtime整体的数据结构如下图:初识objc_object

我们先看Runtime整体的数据结构如下图:

Runtime数据结构详解

初识objc_object

我们平时用到的所有的对象都是id类型,而id对象在runtime中都被定义为objc_object 的结构体。

objc_object的结构体中定义中包含以下五个部分:

1、 isa_t类型的isa

Runtime数据结构详解

2、 isa操作相关

Runtime数据结构详解

3、 弱引用相关方法-可以标记改对象是否包含一些弱引用

Runtime数据结构详解

4、 关联对象相关方法-标记该对象是否有一些关联对象

Runtime数据结构详解

5、 内存管理相关方法-我们平时使用的和内存相关的方法

Runtime数据结构详解

*注:详细的定义可以在Runtime源码编译后工程的Project Headers文件夹下,objc-private.h文件中查看关于objc_objc结构体的定义。

什么是objc_class

在OC语言中的Class对应的Runtime里objc_class, 下图为objc_class的定义,从图中我们也可以看出objc_class继承于objc_object,即objc_class中也含有一个isa指针,并且继承了objc_object的相关的方法及函数。所以我们定义的类也可以被看作是一个对象。 

Runtime数据结构详解

截图中我们只截了重要的定义忽略了一系列的函数,如果想要查看,可以在Runtime源码编译后工程的Project Headers文件夹下objc-runtime-new.h中查看所有的方法。

而本文我们主要讲下最重要的三个数据成员。

1. Class superclass : Class类型,表示当前类的父类。

2. cache_t cache : 方法缓存的结构,在消息传递过程中会被用到。用于优化方法调用,提高性能。其数据结构实际上是一个可增量扩展的哈希表,用来缓存我们调用频次较高的函数。这个哈希表中存放的是bucket_t,而bucket_t中包含了key、IMP,key为方法名,而IMP我们可以将其理解为函数指针,这样在执行方法的时候我们拿到方法名就可以快速的查找到对应的执行函数指针。下图为cache_t及bucket_t的具体定义,同样可以在objc-runtime-new.h中找到。

Runtime数据结构详解

Runtime数据结构详解

3. class_data_bits_t bits : 类结构中的核心部分,它的作用类似于优化过的isa指针,下文中会再详细。 

class_data_bits_t bits

class_data_bits_t bits只含有一个成员uintptr_t bits,uintptr_t实际上是unsigned long类型,在arm64为8字节(64位),我们可以将uintptr_t bits理解为一个64位的存储域,里面存储的不仅包含指针,而且可以同时包含类的一些信息,这些信息通过对应的掩码获取,比如在类结构中非常重要的class_rw_t*就是通过(bits & FAST_DATA_MASK)来获取,具体见struct class_data_bits_t内部的data()函数。

Runtime数据结构详解

下面我们来看下class_rw_t是个什么呢?

class_rw_t定义

Runtime数据结构详解

截图中我们省略了函数,省略部分同样可以在objc-runtime-new.h中找到

从截图中我们可以看到最重要的数据结构有:

1、 class_ro_t *ro下面再分析这个数据结构。

2、 method_array_t method;方法列表。

3、 property_array_t properties;属性。

4、 protocol_array_t protocols;协议。

5、 firstSubclass、nextSiblingClass与继承相关的指针。

6、 demangledName Class对应的符号名称。

class_ro_t  *ro常量指针

该指针指向的内容是只读不可修改的。关于class_ro_t的定义可以参见下图:

Runtime数据结构详解

需要我们关注的主要是:

* name 函数名

* baseMethodList 方法列表

* baseProtocols 协议

* ivars 类的成员变量

* baseProperties属性

其中method_list_t是一个数组包含了多个method_t,而method_t就是我们平常使用的函数,其结构体包括:

* 名称

* 返回值类型

* 函数体

* 参数如下图:

Runtime数据结构详解

总结:本文主要介绍了我们平常OC中使用的对象、类以及类中的方法在runtime中的定义及数据结构,关于runtime源码的编译可参见下边的Runtime源码编译链接。

Runtime数据结构详解

参考文章链接

Runtime源码编译链接:

https://mp.weixin.qq.com/s/hfwZiKt4D46gg9GOg1ZOsw

https://blog.csdn.net/u013378438/article/details/80493158

https://www.jianshu.com/p/75c0d214dc8b

https://www.jianshu.com/p/13457a27624c


以上所述就是小编给大家介绍的《Runtime数据结构详解》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

失业的程序员

失业的程序员

沈逸 / 2014-5-1 / 39.00元

这是一个程序员从失业到自行创业的奋斗历程,虽然囧事连连、过程曲折,却充满了趣味。本书以作者的真实创业经历为主线,文字幽默诙谐,情节生动真实,包括了招聘、团队管理和用户公关,以及技术架构设计、核心代码编写、商务谈判、项目运作等场景经验。 从初期的创业伙伴、领路人,到商业竞争对手,各种复杂的关系在各个关键时刻却都发生了意想不到的逆转。在历经千辛万苦,眼看快要成功时,主人公却几乎再次失业。 ......一起来看看 《失业的程序员》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具