D、题:对象的isa指针指向哪里?
答:
1. instance的isa指向class对象,class的isa指向meta-class对象
2. meta-class的isa指向基类的meta-class对象,基类的isa指向自己。
3. 当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用;
4. 当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用。
拓展:
class对象的superclass指针指向哪里?
答:@interface Student: Person @interface Person: NSObject
1. 当Student的instance对象要调用Person的对象方法时,
会先通过instance的isa找到Student的class,
然后通过superclass找到Person的class,
最后找到对象方法的实现进行调用。
2. 类对象的superclass指针指向父类的class
meta-class对象的superclass指针指向哪里?
答:@interface Student: Person @interface Person: NSObject
1. 当Student的class对象要调用Person的类方法时,
会先通过class的isa找到Student的meta-class,
然后通过superclass找到Person的meta-class,
最后找到类方法的实现进行调用。
2. 元类对象的superclass指针指向父类的meita-class
isa、superclass总结:
1. instance的isa指向class
2. class的isa指向meta-class
3. meta-class的isa指向基类的meta-class(基类的meta-class的isa指向自己)
4. class的superclass指向父类的class(如果没有父类,则superclass为nil)
5. meta-class的superclass指向父类的meta-class(基类的meta-class的superclass指向基类的class)
6. instance调用方法的轨迹:isa找到class,方法存在,直接调用方法实现,如果方法不存在,就通过superclass找到父类,同理;如果superclass为nil,就会报错(unrecognized selector sent to instance)。
7. class调用方法轨迹:isa找到meta-class,方法存在,直接调用方法实现,如果方法不存在,就通过superclass找到父类,同理;如果基类meta-class中方法还不存在,就会通过superclass找到基类的class,这里如果还没有方法,此时superclass为nil,就会报错(unrecognized selector sent to class)。
8. 方法调用:isa->superclass->superclass->...->superclass=nil
isa,superclass
isa的值找class:
1. 从64bit开始,isa需要进行一次位运算,才能计算出class的真实地址。即:isa & isa_mask & ISA_MASK
# if __arm64__
#define ISA_MASK 0x0000000ffffffff8ULL
# elif __x86_64__
#define ISA_MASK 0x00007ffffffffff8ULL
# endif
E、题:OC的类信息存放在哪里?
答:
1. 对象方法、属性、成员变量、协议信息等存放在class对象中;
2. 类方法存放在meta-class对象中;
3. 成员变量的具体值存放在instance对象中。
网友评论