文章目录
一、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 指针指向哪里?
**🏆结束语🏆 **
最后如果觉得我写的文章对您有帮助的话,欢迎点赞✌,收藏✌,加关注✌哦,谢谢谢谢!!