美文网首页
温故而知新-方法的继承的调用顺序

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

作者: 哆啦_ | 来源:发表于2017-09-30 18:58 被阅读28次

    写在前面

    再有俩小时不到就国庆了,八天假期实在美滋滋,搞得现在一点上班的心思都没了,也因为现在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会为类增加一个方法,而且会最优先调用

    相关文章

      网友评论

          本文标题:温故而知新-方法的继承的调用顺序

          本文链接:https://www.haomeiwen.com/subject/lfzgextx.html