• Runtime实现对象方法的实现交换


    场景:

    我们有一个"Person"类,有一个对象方法"sayHiWithEnglish",打印输出英文"hello"。我们仍想调用此方法,但想打印中文"你好"。

    怎么办呢?此时,我们需要使用运行时交换两个对象方法的实现即可。

    代码很简单,注释很详细,不再做过多解释。

    // 本类
    
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    
    - (void)sayHiWithEnglish;
    
    @end
    
    #import "Person.h"
    
    @implementation Person
    
    - (void)sayHiWithEnglish{
        NSLog(@"hello");
    }
    
    @end
    // 分类
    
    #import "Person.h"
    
    @interface Person (Extension)
    
    @end
    
    #import "Person+Extension.h"
    #import <objc/runtime.h> // 导入头文件
    
    @implementation Person (Extension)
    
    //当应用启动时,会对项目中所有的类进行一次加载,此时就会调用该方法
    + (void)load{
        
        // 获取老方法
        Method oldM = class_getInstanceMethod([self class], @selector(sayHiWithEnglish));
        // 获取用于交换实现的新方法
        Method newM = class_getInstanceMethod([self class], @selector(sayHiWithChinese));
        
        // 运行时交换两个方法的实现
        method_exchangeImplementations(oldM, newM);
    }
    
    // 当该类被首次使用时调用
    + (void)initialize{
        
    }
    
    // 新方法,用于替换老方法的实现
    - (void)sayHiWithChinese{
        NSLog(@"你好");
    }
    
    @end

    调用:

    - (void)viewDidLoad {
        [super viewDidLoad];
     
        Person *per = [[Person alloc] init];
        [per sayHiWithEnglish];
    }
    
    // 打印输出的是中文“你好”
  • 相关阅读:
    修改 jenkins 主目录
    pom中Maven插件 配置 maven-dependency-plugin maven-surefire-plugin
    Oracle解决ora-01653 无法通过1024扩展
    windows 定时备份linux 上oracle 数据库
    oracle drop 表后 恢复
    jenkins 安装
    关于RedHat Linux无法使用yum命令安装gcc-c++问题
    eolinker 安装时遇到的坑
    mysql linux安装教程
    JWT ajax java spingmvc 简洁教程
  • 原文地址:https://www.cnblogs.com/panda1024/p/6369406.html
Copyright © 2020-2023  润新知