温故而知新-方法的继承的调用顺序

写在前面

再有俩小时不到就国庆了,八天假期实在美滋滋,搞得现在一点上班的心思都没了,也因为现在app没什么好修改的了,闲着无聊就测试下在OC中继承与Category的方法调用的优先级。
(之所以选择测试继承与Category,是因为这部分知识比较简单,大家都学过,用来打发时间是比较合适的)

OC的三大特性:封装继承多态,使用继承的好处大家也都很了解了:实现代码的复用对问题的统一处理等等。


目的:测试继承和延展的方法调用优先级

我这里创建了四个类,ClassA、ClassB、ClassC、ClassD,其中ClassA继承自NSObject,ClassD继承自C,C继承自BB继承自A,又写了一个NSObject的延展NSObject + Class,各自声明和实现了方法 + (void)logMessage;

+ (void)logMessage
{
    NSLog(@"this is category / classA  / ClassB / ClassC / ClassD  method ----");
}

在控制器导入四个类和延展,页面有四个按钮(ClassAClassBClassCClassD),点击方法分别调用各类的方法

- (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+ClasslogMessage方法的声明和实现,防止Category的影响。
点击ClassA按钮,不出意外的程序挂掉了,

屏幕快照 2017-09-30 下午5.44.44.png

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会为类增加一个方法,而且会最优先调用

你可能感兴趣的:(温故而知新-方法的继承的调用顺序)