写在前面
再有俩小时不到就国庆了,八天假期实在美滋滋,搞得现在一点上班的心思都没了,也因为现在app没什么好修改的了,闲着无聊就测试下在OC中继承与Category的方法调用的优先级。
(之所以选择测试继承与Category,是因为这部分知识比较简单,大家都学过,用来打发时间是比较合适的)
OC的三大特性:封装、继承、多态,使用继承的好处大家也都很了解了:实现代码的复用、对问题的统一处理等等。
目的:测试继承和延展的方法调用优先级
我这里创建了四个类,ClassA、ClassB、ClassC、ClassD,其中ClassA继承自NSObject,ClassD继承自C,C继承自B,B继承自A,又写了一个NSObject的延展NSObject + Class,各自声明和实现了方法 + (void)logMessage;
+ (void)logMessage
{
NSLog(@"this is category / classA / ClassB / ClassC / ClassD method ----");
}
在控制器导入四个类和延展,页面有四个按钮(ClassA、ClassB、ClassC、ClassD),点击方法分别调用各类的方法
- (IBAction)classA:(id)sender {
[ClassA logMessage];
}
- (IBAction)classB:(id)sender {
[ClassB logMessage];
}
- (IBAction)classC:(id)sender {
[ClassC logMessage];
}
- (IBAction)classD:(id)sender {
[ClassD logMessage];
}
一、测试父类是否会调用子类的方法
注释掉ClassA中方法实现,保留.h中的方法声明,注释掉NSObject+Class中logMessage方法的声明和实现,防止Category的影响。
点击ClassA按钮,不出意外的程序挂掉了,

reason提示说ClassA找不到logMessage方法,说明父类并不会调用子类的方法
二、测试自身和父类方法的调用优先级
点击ClassB按钮,查看打印信息为
InheritDemo[25434:811698] this is ClassB method ----
说明自身的方法优先于父类被调用
三、测试自身和 category方法调用优先级
导入ClassA + Class文件,并实现logMessage方法,
点击ClassA按钮, 查看打印信息为
InheritDemo[25434:811698] this is ClassA category method ----
说明** Category方法的调用优先于自身的方法调用**
四、测试自身和父类的Category的优先级
注释掉ClassB + Category中的方法声明和实现,点击ClassB按钮,查看打印信息,看ClassB是调用ClassA category(也就是其父类的category)中的方法还是ClassB中的方法。
控制台输出为:
InheritDemo[25476:817259] this is ClassB method----
说明ClassB是调用了ClassB(也就是自身)中的方法,也就是说明自身的方法调用会优于父类的category方法被调用
总结:
- 方法调用顺序:自身
category> 自身方法 > 父类的category> 父类方法- 父类不会调用子类的方法
Category会为类增加一个方法,而且会最优先调用