Skip to content

Files

Latest commit

author
yuwuchao
Jan 10, 2023
453e2fb · Jan 10, 2023

History

History
83 lines (55 loc) · 2.2 KB

2:对象的isa指针指向哪里?.md

File metadata and controls

83 lines (55 loc) · 2.2 KB

贰:对象的isa指针指向哪里?

题目:对象的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

isa

上图需要注意的主要有两点:

  1. 查看 superclass 指针要注意一点:根元类的 superclass 是指向 根类的。
  2. 在元类中的 isa 指针都是指向根元类,包括根元类自身的 isa 指针也是指向自身。