请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

场景:
有三个类 person、person的分类personA、person的分类NSObjectA

每个类都有一个 +(void)eat;

调用 [Person eat];

不管编译的顺序怎么调整始终调用的是person-category的eat方法;

按照isa 指针查找类对象查找的元类。元类指向自己。然后只想根类nsobject。按照这个思路应该调用NSObject 的eat方法。

求助希望有人可以解惑!!!

正在回答 回答被采纳积分+3

2回答

瞅瞅 2019-11-24 10:21:19

我认为题主应该是把isa指针和superclass指针指向搞混了。

类方法的调用 是按照该类对象的isa指针 查找元类对象中的类方法列表

(完整查找顺序:缓存-方法列表-按照superclass指针逐级父类)。

那么调用 [Person eat],是去person元类对象类方法列表查找,person元类对象中methods包含了分类personA定义的eat方法实现,并且在宿主类方法eat实现之前。即执行分类personA的eat方法实现。消息传递结束,也就不会再按superclass往父类查找了。

至于NSObject的分类NSObjectA的eat方法是存在于根元类对象里。




1 回复 有任何疑惑可以回复我~
于海 2019-09-01 09:10:16

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

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信