0
点赞
收藏
分享

微信扫一扫

OC:对象的isa指针和superclass指针分别指向哪里,你知道了吗?


文章目录

一、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 的流程图:
在这里插入图片描述引用上面的代码示例分析如下:
请添加图片描述结论:

五、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 指针指向哪里?


**🏆结束语🏆 **

最后如果觉得我写的文章对您有帮助的话,欢迎点赞✌,收藏✌,加关注✌哦,谢谢谢谢!!

举报

相关推荐

0 条评论