iOS底层学习 - 类的底层探索

文章开始,我们继续使用上一篇文章的demo,打开使用clang编译后的main.cpp
clang编译main.m.jpg

通过这张图,我们可以发现以下几点:

  • 自定义类的类名是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最新优化的,我们后面的类的结构分析也是基于新版来分析的。


objc_class.png

其中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属性。

你可能感兴趣的:(iOS底层学习 - 类的底层探索)