对象的本质

在了解对象之前先了解:Clang

Clang是一个C语言、C++、Objective-C语言的轻量级编译器。源代码发布于BSD协议下。 Clang将支持其普通lambda表达式、返回类型的简化处理以及更好的处理constexpr关键字。

Clang是一个由Apple主导编写,基于LLVM的C/C++/Objective-C编译器

我们要利用Clang语句生产.cpp文件 

  用终端进入main.m路径输入:$clang -rewrite-objc main.m -o main.cpp 


main.cpp

在main函数中假如一个字符串属性 用来测试对象在底层

写完之后打开.cpp文件 发现这个属性在结构体里面 struct 

struct NSObject_IMPL NSObject_IVARS;  == isa; 在.cpp文件中 搜索会得到


源码objc

在源码中可以看到Class & id 都是struct 都是结构体指针 都是8字节

arm64 位之后 isa变成了一个 结构体位域 NONPOINTER_ISA 现在的isa 基本上都是被优化过的isa 联合体位域


ISA_MASK        0x00007ffffffffff8ULL


通过掩码进行计算得出两个不同的内存地址 输出同一个类


通过代码测试打印出来0x1000082d0 才是我们的类并且是一摸一样

0x00000001000082a8是一个新的东西 并不是类

对象 isa-> 类 isa-> 元类(系统生成和使用的mateClass)

isa走位图

继承链


通过代码看到 元类 根元类  根根元类 NSObject 内存地址都是0x7fff88959fe0

也就是对象->对象的isa->类->类的isa->元类,继承关系


对象的结构


源码

要获取内存的结构

通过x/4gx 打印出内存结构 进行分析得出和结构体 superclass、cache、bits、isa一一对应。


源码

在源码里面看到class_data_bits_t结构体里面看到有一个class_rw_t*data 这就是我们要的东西



类里面声明的属性


同理获取类里面的方法 发现取不到怎么办 看源码method_t



取到所以的实例方法 count=6 下标从0开始 超了报错 

你可能感兴趣的:(对象的本质)