zoukankan      html  css  js  c++  java
  • Runtime实现类方法的实现交换

    场景:我们调用[UIImage imageNamed:@"1"]方法,但实现使用自定义的方法实现。

    由于代码很简单,注释很详细,不做解释了,直接上代码。

    #import <UIKit/UIKit.h>
    
    @interface UIImage (Extension)
    
    @end
    #import "UIImage+Extension.h"
    #import <objc/runtime.h> // 导入头文件
    
    @implementation UIImage (Extension)
    
    //当应用启动时,会对项目中所有的类进行一次加载,此时就会调用该方法
    + (void)load{
        // 获取系统方法
        Method systemM = class_getClassMethod([UIImage class], @selector(imageNamed:));
        // 获取自定义方法
        Method customM = class_getClassMethod([UIImage class], @selector(ysImageNamed:));
        // 运行时交换两个方法的实现:注意死循环问题
        method_exchangeImplementations(systemM, customM);
    }
    
    // 当该类被首次使用时调用
    + (void)initialize{
        
    }
    
    /**
     自定义类方法,用于和系统方法“实现”交换
    
     @param imgName 图片名称
     @return 图片
     */
    + (UIImage *)ysImageNamed:(NSString *)imgName{
        NSString *name = [NSString stringWithFormat:@"%@_white",imgName];
        // 注意:这里一定要调用自定义方法,不能调用imageNamed:方法,否则会引起死循环,因为此方法和imageNamed:的实现交换了
        return [UIImage ysImageNamed:name];
    }
    
    @end
  • 相关阅读:
    Hadoop Gateway 部署
    java 命令--备忘
    整理下常用硬件性能参数
    python 脚本备份 mysql 数据库到 OSS
    pip 更换国内源
    记录闭包和立即执行函数
    Django 中文乱码问题&富文本显示
    mysql exceeded the 'max_questions' resource 记录
    sql server 数据字典的妙用
    Sublime Text指南
  • 原文地址:https://www.cnblogs.com/panda1024/p/6369288.html
Copyright © 2011-2022 走看看