在了解对象之前先了解: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开始 超了报错
网友评论