父类,父类的分类、子类 同时重写方法,调用问题

文章探讨了在Objective-C中,当父类、子类和分类都定义了相同方法时,如何决定调用哪个版本。OC遵循先类自身,再父类,最后分类的方法查找顺序,且分类中的方法优先于子类重写。
摘要由CSDN通过智能技术生成

做一个猜想,当父类、父类的分类、子类 都写了同一个方法,那么在调用的时候会优先调用哪个方法呢?我们可以先写一个简单的demo

@implementation Person

+ (void)test {
    NSLog(@"%@",self.class);
}

@end

然后是Person的分类

#import "Person+Test.h"

@implementation Person (Test)

+ (void)test {
    NSLog(@"Test %@",self.class);
}

@end

然后是Person的子类Student

#import "Student.h"

@implementation Student

+ (void)test {
    NSLog(@"Student %@",self.class);
}

@end

他们同时写了Test方法,看一下这样调用的执行结果

[Person test];
[Student test];

可以看到,Person调用的分类的方法,Student调用了自己重写的方法。

那么如果我们删掉Student自己重写的方法呢

这个时候,调用的就都是分类的方法了。

这个时候如果Person又有了一个分类呢

@implementation Person (Live)

+ (void)test {
    NSLog(@"Live %@",self.class);
}

@end

发现运行结果依然是

为什么会有这样的结果呢?

这个需要从OC中的方法调用机制和category中方法的加载顺序说起。

首先,OC中一个类调用方法的顺序是,先在自己的类中查找,如果找不到,才会找到父类当中,这就解释了,只要Student类中有这个方法,那么就一定会执行Student类中的方法。

其次,OC的类方法加载是,会按照先类中的方法,后分类中的方法,添加进方法列表中。但是在读取的时候,会先调用后进入列表的方法(可以理解成栈),所以,如果一个类和分类中都有一个方法,会优先调用分类中的方法。

最后,如果有多个分类都写了同一个方法,那么根据方法的调用规则,会调用后加入列表的方法,但是多个分类哪个先加入呢,是按照这里来的:

这个图上,是Live分类在前边,所以添加方法的时候,是先将Live分类的方法加入方法列表,后将Test分类的方法加入方法列表,所以最终执行的时候,调用的是Test中的方法。

如果想执行Live中的方法,可以改变这里的顺序为

这样,执行的结果就是Live了

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大类,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更加深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值