一、isa指针
# if __arm64__ # define ISA_MASK 0x0000000ffffffff8ULL # elif __x86_64__ # define ISA_MASK 0x00007ffffffffff8ULL #endif
1、instance对象(实力对象)的 isa 指向class对象。
2、当调用对象方法时,通过instance的 isa 找到class,最后找到对象方法的实现进行调用。
3、class对象的 isa 指向 meta-class对象
4、当调用类方法时,通过class的 isa 找到meta-class,最后找到类方法的实现进行调用。
5、从64bit开始,isa 需要进行一次位运算,才能计算出真实地址。
二、class对象的superclass指针
创建两个类,以下示例下文通用:
@interface Person : NSObject @end @implementation Person @end @interface Student : Person @end @implementation Student @end
那么它们之间的 superclass 指针的指向关系如下:
当Student的instance对象要调用Person的对象方法时,会先通过 isa 找到Student的class,然后通过 superclass 找到Person的class,最后找到对象方法的实现进行调用。
三、meta-class对象的superclass指针
当Student的class要调用Person的类方法时,会先通过isa找到Student的meta-class,然后通过superclass找到Person的meta-class,最后找到类方法的实现进行调用
四、isa,superclass一览
这是一张来自大佬的关于解释 isa、superclass 的流程图:
引用上面的代码示例分析如下:
结论:
instance对象的 isa 指向class对象。
class对象的 isa 指向meta-class对象
meta-class对象的 isa 指向基类的meta-class对象
class对象的 superclass 指向父类的class对象,如果没有父类,superclass指针为nil。
meta-class对象的 superclass 指向父类的meta-class对象
基类的meta-class对象的 superclass 指向基类的class对象
instance对象调用对象方法的轨迹:
isa 找到class,方法不存在,就通过 superclass 找父类,直到知道为止。
class对象调用类方法的轨迹:
isa找meta-class对象,方法不存在,就通过 superclass 找父类,一直找到基类的meta-class对象,如果还没有找到,继续通过 superclass 指向基类的class对象。直到找到为止。
五、struct objc_class结构分析
class对象、meta-class对象的本质结构都是struct objc_class。其底层实现如下图:
添加数据指针偏移量:
#if !__LP64__ #define FAST_DATA_MASK 0xfffffffcUL #elif 1 #define FAST_DATA_MASK 0x00007ffffffffff8UL #else #define FAST_DATA_MASK 0x00007ffffffffff8UL #endif
拓展
1、OC对象的 isa 指针指向哪里?
1、instance对象的isa指向class对象。
2、class对象的isa指向meta-class对象。
3、meta-class对象的isa指向基类的meta-class对象。