前置知识

为什么学习ISA

isa在Runtime中起到了关键的作用,苹果是通过isa将instance、class和meta-class串联起来的。

Untitled

Untitled

寻找isa

在查看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声明。

Untitled

从上图得知isa是一个 isa_t类型,并且他是一个私有变量,那么isa_t他是什么呢?接下来我们进行学习。

isa_t

isa_t的定义可以在objc-private.h文件中找到: