美文网首页
方法交换与继承关系

方法交换与继承关系

作者: 一个栗 | 来源:发表于2020-12-15 20:13 被阅读0次

条件:ViewController在load方法内交换了viewDidLoad方法,但子类的viewDidLoad没有写[super viewDidLoad]
问:子类的viewDidLoad执行的是父类交换后的还是自己的?
答:只执行自己的,不会去找父类的方法。方法查找过程,自身实现的,不会去查找父类的。

//父类
@implementation ParentVC

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"======ParentVC======");
}

@end
// 方法交换
@implementation ParentVC (Catrgory)

+ (void)load {
    Method origin = class_getInstanceMethod([self class], @selector(viewDidLoad));
    Method swizz = class_getInstanceMethod([self class], @selector(llviewDidLoad));
    
    BOOL didAdd = class_addMethod([self class], @selector(viewDidLoad), method_getImplementation(swizz), method_getTypeEncoding(swizz));
    
    if (didAdd) {
        class_replaceMethod([self class], @selector(llviewDidLoad), method_getImplementation(origin), method_getTypeEncoding(origin));
    } else {
        method_exchangeImplementations(origin, swizz);
    }
}

- (void)llviewDidLoad {
    NSLog(@"======ParentVC+Catrgory======");
}

@end
//子类
- (void)viewDidLoad {
    NSLog(@"======Student======");
   }

执行结果如下:

2020-12-15 20:01:56.121563+0800 test[90699:14720833] ======ParentVC+Catrgory======
//以下是子类调用打印
2020-12-15 20:02:06.133559+0800 test[90699:14720833] ======Student======
2020-12-15 20:02:06.133993+0800 test[90699:14720833] ======Student======

若子类代码修改如下:

//子类
- (void)viewDidLoad {
   [super viewDidLoad];
    NSLog(@"======Student======");
   }
2020-12-15 20:07:40.416351+0800 test[90724:14725040] ======ParentVC+Catrgory======
//以下是子类调用打印
2020-12-15 20:07:46.244325+0800 test[90724:14725040] ======ParentVC+Catrgory======
2020-12-15 20:07:46.244549+0800 test[90724:14725040] ======Student======
2020-12-15 20:07:46.244963+0800 test[90724:14725040] ======ParentVC+Catrgory======
2020-12-15 20:07:46.245082+0800 test[90724:14725040] ======Student======

相关文章

  • 方法交换与继承关系

    条件:ViewController在load方法内交换了viewDidLoad方法,但子类的viewDidLoad...

  • java046接口和类之间的各种关系

    1.类与类:继承关系,单一继承,多层继承 2.类与接口:实现关系,多实现(因为里面的方法都是抽象方法) inter...

  • 类关系

    六种关系继承与实现关系:类B继承类A或者接口A,就称为继承与实现关系。依赖关系:类B独立模型,类A中方法用到类B,...

  • 《Java8学习笔记》读书笔记(七)

    第6章 继承与多态 学习目标 了解继承的目的 了解继承与多态的关系 知道如何重写方法 认识java.lang.Ob...

  • java.util.TreeMap源码解析

    所属包 继承与实现关系 属性 红黑树数据结构 构造方法 putAll方法 buildFromSorted方法 方法...

  • 继承

    继承1.继承的概念:继承是类与类的一种关系,是一种“is a”的关系2.继承的好处:子类拥有父类的所有属性和方法,...

  • python(进阶二)

    多态 封装 继承 mro 及多继承 实例与类之间的调用关系 property 魔法属性与方法 上下文管理器

  • 简述Python中多态,继承,封装,propertyy

    多态 封装 继承 mro 及多继承 实例与类之间的调用关系 property 魔法属性与方法 上下文管理器

  • python中一些高级语法和使用

    多态 封装 继承 mro 及多继承 实例与类之间的调用关系 property 魔法属性与方法 上下文管理器

  • 面向对象三大特性之继承

    1.继承 继承是类与类的一种关系,注意:java中的继承是单继承。 继承的好处:子类拥有父类的所有属性和方法;代码...

网友评论

      本文标题:方法交换与继承关系

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