题目:对象的isa指针指向哪里?
答: 根据对象的类型不同,isa 指针指向也不同:
- instance对象的isa指向class对象
- class对象的isa指向meta-class对象
- meta-class对象的isa指向基类的meta-class
NSObject *obj = [[NSObject alloc] init] ;
/**
obj 就称之为 实例对象(instance对象),对象内部存放了 isa 指针。
*/
实例对象存储的信息主要包括:
- 特殊的成员变量:isa
- 其它成员变量
Class objectClass1 = [obj class];
Class objectClass2 = [NSObject class];
/**
objectClass1、objectClass2地址值相等,指向的是同一个类对象(Class 对象)
*/
class对象在内存中存储的信息主要包括:
- isa 指针
- superclass 指针
- 类的属性信息(property)、类的对象方法信息(instance methods)
- 类的协议信息 (protocol)、类的成员变量信息(Ivar)
- ...
Class objectMetaClass = object_getClass([NSObject class]);
Class objectMetaClass = object_getClass(objectClass2);
metaClass 对象在内存中存储的信息主要包括:
- isa指针
- superclass指针
- 类的类方法信息(class method)
- 实例对象的 isa "指向" 类对象。
- 类对象的 isa "指向" 元类对象。
- 元类对象的 isa "指向" 根元类对象。
注意:从64位架构之后,"指向"并不是真正的指向,而是会通过 isa 指针指向的内存地址按位与(&)上 ISA_MASK(0x0000000ffffffff8ULL) ,得出真正的指向地址。
# if __arm64__
# define ISA_MASK 0x0000000ffffffff8ULL
# elif __x86_64__
# define ISA_MASK 0x00007ffffffffff8ULL
# endif
上图需要注意的主要有两点:
- 查看 superclass 指针要注意一点:根元类的 superclass 是指向 根类的。
- 在元类中的 isa 指针都是指向根元类,包括根元类自身的 isa 指针也是指向自身。