isa在Runtime中起到了关键的作用,苹果是通过isa将instance、class和meta-class串联起来的。
在ARM64架构之前:isa就是一个普通指针,直接存储着class或者metaclass地址;
在ARM64架构:isa进行了优化,变成了一个共用体(union)结构,还使用了位域技术存储更多的元素,在这时我们可以通过 & ISA_MASK得到class或meta-class的地址
arm64e架构:苹果采用了PAC技术,对指针进行了加密,再去通过isa & ISA_MASK获取class或meta_class地址已经不可靠了。
在查看NSObject类发现他有一个isa成员变量,并且声明为Class类型。
@interface NSObject <NSObject> {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-interface-ivars"
Class isa OBJC_ISA_AVAILABILITY;
#pragma clang diagnostic pop
}
Class是什么类型呢?我们找到了typedef struct objc_class *Class ,这里objc_class在头文件中找不到了,我们只能从苹果提供的源代码找到他的身影。
在源代码中找到了struct objc_class : objc_object结构体,但是没有发现isa。在C++中结构体是可以继承的,这时我们在看看他的父结构体,发现在objc_object中找到了isa声明。
从上图得知isa是一个 isa_t类型,并且他是一个私有变量,那么isa_t他是什么呢?接下来我们进行学习。
isa_t的定义可以在objc-private.h文件中找到: