OC对象分为3种:
instance对象(实例对象)
class对象(类对象)
meta-class对象(元类对象)
OC对象的本质是结构体,每一个对象内部有一个isa指针(占8个字节)。
oc对象源码 isa指针与superClass指针指向实例对象:
所有父类的成员变量和自己的成员变量具体值都会存放在该对象所对应的存储空间中。isa指针指向他的类对象(64bit后,isa需要进行一次位运算(& ISA_MASK),才能计算出类对象的真实地址),实例对象没有superClass指针。
类对象:
在内存中存储的信息主要包括:isa指针(因为类本身也是一个对象)、superClass指针、类的属性信息(@property)、类的对象方法信息(instance method)、类的协议信息(protocol)、类的成员变量信息(注意:ivar,不是成员变量的值,是指类型、名字)。
类对象isa指针指向元对象(meta class)
元对象(meta-class):
在内存中存储的信息主要包括:isa指针、superclass指针、类的类方法信息。元对象(meta-class)对象和类(class)对象内存结构一样
meta-class对象的isa指向基类的meta-class对象
isa指针的详解与作用:
在arm64架构之前,isa就是一个普通的指针,存储着Class、Meta-Class对象的内存地址,在arm64开始,对isa进行了优化,变成了一个共用体(union)结构,还是用位于来存储很多信息。
因为类对象中存储着类的对象方法信息,当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用
因为元对象中存储着类的类方法信息,当调用类方法时,通过class的isa找到meta-class.最后找到类方法的实现进行调用
superClass指针的作用:
当一个对象调用的方法来自于父类:因为类对象的superClass指向父类的类对象:1、通过对象的isa指针找到类对象 2、通过类对象的superclass父类类对象,从而的父类对象方法列表中找到方法的实现。
当调用来自父类的类方法时:因为元类对象的superClass指针指向父类的元类对象:1、通过类对象的isa指针找到元类对象 2、通过元类对象的superClass指针找到父类元对象,从而在父类元类对象方法列表中找到方法实现。一层层传递,如果走到基类的元对象仍没有找到方法实现,就去基类的类对象中去寻找实例方法。
值得注意的是:如果没有父类,类对象的superclass指针为nil,元类(meta-class)的superclass指针指向基类的类对象(isa指针与superClass指针指向图可以看出)
网友评论