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 2.5.1 、Hadoop 2.7 Hadoop 2.6
    二 JDK + mysql + yum + rpm
    一 SSH 无密码登陆 & Linux防火墙 & SELinux关闭
    ZooKeeper 配置注意事项 zoo.cfg
    ZooKeeper 特性
    分布式锁
    悲观锁和乐观锁
    windows上配置mysql主从复制
    C# 同步调用、异步调用、异步回调
    C#方法回调
  • 原文地址:https://www.cnblogs.com/panda1024/p/6369288.html
Copyright © 2011-2022 走看看