通过这张图,我们可以发现以下几点:
- 自定义类的类名是struct objc_object结构体的别名。
- struct DZPerson_IMPL结构体,包含两个成员属性:
- 第一个属性上一篇文章介绍后,NSObject_IVARS 等效于 NSObject中的 isa。
- 第二个属性是我们定义的成员_name
objc_class 与 objc_object
查看NSObject_IMPL结构体,里面有一个成员isa,是Class类型。继续在文件中找到Class是struct objc_class *结构体指针类型。
struct NSObject_IMPL {
Class isa;
};
typedef struct objc_class *Class;
此时我们进入bjc4源码中,去搜索objc_class的定义,源码中对其的定义有两个版本,旧版 位于 runtime.h中,已经被废除,这里不做赘述,新版位于objc-runtime-new.h,这个是objc4-781最新优化的,我们后面的类的结构分析也是基于新版来分析的。
其中cache,存储的是缓存相关信息。
bits里面存放类的相关数据(成员、属性、方法、协议等相关数据信息)。
从新版的定义中,可以看到 objc_class 结构体类型是继承自 objc_object的。因此我们继续去查找objc_object的源码,他也有两个版本:
- 第一个位于 objc.h,没有被废除,从编译的main.cpp中可以看到,使用的这个版本的objc_object。
struct objc_object {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
};
//编译后的main.cpp中的objc_object的定义
struct objc_object {
Class _Nonnull isa __attribute__((deprecated));
};
- 第二个位于 objc-privat.h
struct objc_object {
private:
isa_t isa;
通过上述的源码查找以及main.cpp中底层编译源码,可以得到以下几点结论:
- 结构体类型objc_class 继承自objc_object类型,其中objc_object也是一个结构体,且有一个isa属性,所以objc_class也拥有了isa属性
- mian.cpp底层编译文件中,NSObject中的isa在底层是由Class 定义的,其中class的底层编码来自 objc_class类型,所以NSObject也拥有了isa属性
- NSObject 是一个类,用它初始化一个实例对象objc,objc 满足 objc_object 的特性(即有isa属性),主要是因为isa 是由 NSObject 从objc_class继承过来的,而objc_class继承自objc_object,objc_object 有isa属性。所以对象都有一个 isa,isa表示指向,来自于当前的objc_object
总的来说,就是万物皆对象,万物皆来源于objc_object,所以所有的对象 + 类 + 元类 都有isa属性。