a) instance的isa指向class
1) 当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用;
2) 那么为什么不直接拿到class对象,来调用这个对象方法?
答:OC语法设计,达到面向对象的目的
b) class的isa指向meta-class
1) 当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用;
c) meta-class的isa指向基类的meta-class
2.class对象的superclass指针
a)superclass(继承)
b) 类对象的superclass指针指向的是它父类的类对象
c) 当Student的instance对象调用Person的对象方法时,会先通过isa找到Student的class,然后通过superclass找到Person的class,最后找到对象方法的实现进行调用
3.meta-class对象的superclass指针
a)superclass(继承)
b) 元类对象的superclass指针指向的是它父类的元类对象
c) 当Student的class对象调用Person的类方法时,会先通过isa找到Student的meta-class,然后通过superclass找到Person的meta-class,最后找到类方法的实现进行调用
4.isa&superclass总结
a) instance的isa指向class
b) class的isa指向meta-class
c) meta-class的isa指向基类的meta-class
d) class的superclass指向父类的class(如果没有父类,superclass指针为nil)
e) meta-class的superclass指向父类的meta-class(基类的meta-class的superclass指向基类的class)
f) instance调用对象方法的轨迹
1) isa找到class,方法存在就调用,不存在,就通过superclass找到父类
g) class调用类方法的轨迹
1) isa找到meta-class,方法存在就调用,不存在,就通过superclass找到父类,如果基类的meta-class也没有会通过superclass找到基类的class然后找有没有
5.isa指针地址&superclass指针地址问题
struct mj_objc_class {
Class isa;
Class superclass;};intmain(int argc,constchar* argv[]){@autoreleasepool {// MJPerson类对象的地址:0x00000001000014c8// isa & ISA_MASK:0x00000001000014c8// MJPerson实例对象的isa:0x001d8001000014c9struct mj_objc_class *personClass =(__bridge struct mj_objc_class *)([MJPerson class]);struct mj_objc_class *studentClass =(__bridge struct mj_objc_class *)([MJStudent class]);NSLog(@"1111");// MJPerson *person = [[MJPerson alloc] init];//// Class personClass = [MJPerson class];// struct mj_objc_class *personClass2 = (__bridge struct mj_objc_class *)(personClass);//// Class personMetaClass = object_getClass(personClass);//// NSLog(@"%p %p %p", person, personClass, personMetaClass);// MJStudent *student = [[MJStudent alloc] init];}return0;}
a) 在以前类对象的isa指针的地址指向的就是元类对象的地址,在64位以后,isa需要进行一次位运算,才能计算出真实地址
b)supercalss(继承)是直接指向的不存在这个规则
c) ISA_MASK
#if__arm64__(iOS平台)#defineISA_MASK0x0000000ffffffff8ULL#elif__x86_64__(Mac平台)#defineISA_MASK0x00007ffffffffff8ULL#endif