首先抛出问题类是什么, 类的结构是什么?
上个章节探究了类的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的定义
经过上面的探索,我们可以得出这样一个结论
类的本质就是一个结构体,包含了Class ISA ,Class superclass,cache_t cache,class_data_bits_t bits的结构体
类的结构是什么
上面我们通过一系列的查找终于看了这样一个结构
那么我们就对这个结构逐个分析,首先我们可以看出objc_class继承于NSObject,那个objc_class就有一个通用的isa.
isa的内容比较多,需要单独开辟一片文章学习,下一个章节继续探索