关于分类覆盖同名方法问题
来源:4-3 分类相关面试问题-2

夜鸽
2019-06-27
场景:
有三个类 person、person的分类personA、person的分类NSObjectA
每个类都有一个 +(void)eat;
调用 [Person eat];
不管编译的顺序怎么调整始终调用的是person-category的eat方法;
按照isa 指针查找类对象查找的元类。元类指向自己。然后只想根类nsobject。按照这个思路应该调用NSObject 的eat方法。
求助希望有人可以解惑!!!
写回答
2回答
-
瞅瞅
2019-11-24
我认为题主应该是把isa指针和superclass指针指向搞混了。
类方法的调用 是按照该类对象的isa指针 查找元类对象中的类方法列表
(完整查找顺序:缓存-方法列表-按照superclass指针逐级父类)。
那么调用 [Person eat],是去person元类对象类方法列表查找,person元类对象中methods包含了分类personA定义的eat方法实现,并且在宿主类方法eat实现之前。即执行分类personA的eat方法实现。消息传递结束,也就不会再按superclass往父类查找了。
至于NSObject的分类NSObjectA的eat方法是存在于根元类对象里。
10 -
于海
2019-09-01
类对象的isa指向该类对象对应的元类对象,NSObject类对象也有自己对应的元类对象。
类方法执行需要通过类对象的isa指针去对应的元类对象方法列表中查找。Person类对应的元类对象中存储了eat方法的两个实现,分类方法实现在原有类方法实现之前。NSObject的分类方法存放在NSObject类对应的元类对象中。00
相似问题