iOS 对象原理探索三-类的结构和本质

371 阅读2分钟

ios对象原理探究二

首先抛出问题类是什么,  类的结构是什么?

上个章节探究了类的alloc方法通过源码分析了类的内存空间的开辟,但我们并不知道类到底是什么?它的结构又是怎么样的?

  • 类到底是什么?

研究这个之前我们创建个类MRPerson,用clang命令编译成.cpp文件

打开main.cpp文件,文件很长,Command+F全局搜索MRPerson.(也可以拉到最底下,看的main()函数即可)可以看到

上图可以看出我们的MRPerson是一个Struct类型的结构体

继续分析

那 objc_object 和NSObject_IMPL 又是什么?

因为用的是 typedef Struct 修饰,我们就可以在.cpp文件中全局搜索

它的定义非常明显是包含一个Class类型的isa那么问题又来了,这个Class又是什么?

上图第7152行代码有这样的一个定义:typedef struct objc_class *Class; 通过这一行代码我们可以清楚的看到,这个Class是一个指向objc_class结构体的指针

疑问又来了: objc_class又是什么?

我们继续这个时候我们在.cpp文件中找不到objc_class的相关定义,那个这个时候我们只能在我们的源码中查找:打开我们的源码,刚才通过.cpp文件查找我们关于objc_object的定义找到**objc_class**现在我们在源码中的objc.h 文件中找到

 这样的声明,点击右键跟进**objc_class  **

注意: 上面有两个跳转,我们要找的是objc-runtime-new 文件,点击跳转

objc_class是一个代表对象类的结构体,所以NSObject类中包含的是一个objc_class结构体类型的isa,指向该对象对应的类。

objc_class是继承于objc_object,在objc-private.h中,我们可以找到objc_object的定义

`objc_object`是一个代表**对象实例**的结构体,`objc_object`中只包含一个`isa_t`结构体类型的`isa`,所以`objc_class`中也会包含一个`isa_t`结构体类型的`isa`。**这个`isa_t`结构体包含了当前对象指向的类的信息。**

经过上面的探索,我们可以得出这样一个结论

类的本质就是一个结构体,包含了Class ISA ,Class superclass,cache_t cache,class_data_bits_t bits的结构体

类的结构是什么

上面我们通过一系列的查找终于看了这样一个结构

那么我们就对这个结构逐个分析,首先我们可以看出objc_class继承于NSObject,那个objc_class就有一个通用的isa.

isa的内容比较多,需要单独开辟一片文章学习,下一个章节继续探索