关于分类覆盖同名方法问题

来源: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方法是存在于根元类对象里。




1
0

于海

2019-09-01

类对象的isa指向该类对象对应的元类对象,NSObject类对象也有自己对应的元类对象。
类方法执行需要通过类对象的isa指针去对应的元类对象方法列表中查找。Person类对应的元类对象中存储了eat方法的两个实现,分类方法实现在原有类方法实现之前。NSObject的分类方法存放在NSObject类对应的元类对象中。

0
0

资深大牛带你深度剖析ios高级面试

从BAT/TMD名企真题入手,结合源码及应用,构建完整iOS知识体系

1749 学习 · 600 问题

查看课程