采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
场景: 有三个类 person、person的分类personA、person的分类NSObjectA
每个类都有一个 +(void)eat;
调用 [Person eat];
不管编译的顺序怎么调整始终调用的是person-category的eat方法;
按照isa 指针查找类对象查找的元类。元类指向自己。然后只想根类nsobject。按照这个思路应该调用NSObject 的eat方法。
求助希望有人可以解惑!!!
我认为题主应该是把isa指针和superclass指针指向搞混了。
类方法的调用 是按照该类对象的isa指针 查找元类对象中的类方法列表
(完整查找顺序:缓存-方法列表-按照superclass指针逐级父类)。
那么调用 [Person eat],是去person元类对象类方法列表查找,person元类对象中methods包含了分类personA定义的eat方法实现,并且在宿主类方法eat实现之前。即执行分类personA的eat方法实现。消息传递结束,也就不会再按superclass往父类查找了。
至于NSObject的分类NSObjectA的eat方法是存在于根元类对象里。
类对象的isa指向该类对象对应的元类对象,NSObject类对象也有自己对应的元类对象。类方法执行需要通过类对象的isa指针去对应的元类对象方法列表中查找。Person类对应的元类对象中存储了eat方法的两个实现,分类方法实现在原有类方法实现之前。NSObject的分类方法存放在NSObject类对应的元类对象中。
登录后可查看更多问答,登录/注册
从BAT/TMD名企真题入手,结合源码及应用,构建完整iOS知识体系
1.3k 11
1.9k 9
1.2k 9
1.0k 8
970 8