Runtime作用之 方法交换

交换方法

应用场景: 当第三方框架或者系统原生方法不能满足的时候,可以在原有方法的基础上,添加额外的功能.

需求: 加载一张图片直接用[UIImage imageNamed:@"image"];是无法知道到底有没有加载成功。给系统的imageNamed添加额外功能(是否加载图片成功)。

实现步骤:给UIImage添加一个分类Category

#import "UIImage+Load.h"
#import 
#import 
@implementation UIImage (Load)

//方法交换

+ (void)load {
    
    // 1.获取 imageNamed方法地址  class_getClassMethod(获取某个类的方法)
    
    Method imageNamedMethod = class_getClassMethod(self,@selector(imageNamed:));
    
    // 2.获取 ln_imageNamed方法地址
    
    Method ln_imageNamedMethod = class_getClassMethod(self,@selector(ln_imageNamed:));
    
    // 3.交换方法地址,相当于交换实现方式; 「method_exchangeImplementations 交换两个方法的实现」
    
    method_exchangeImplementations(imageNamedMethod, ln_imageNamedMethod);

}


+ (UIImage*)ln_imageNamed:(NSString*)name {
    
    UIImage *image = [UIImage ln_imageNamed:name];  //注意这里
    
    if(image) {
        
        NSLog(@"runtime添加额外功能--加载成功");
        
         }else{
            
            NSLog(@"runtime添加额外功能--加载失败");
       }
    
    return image;
    
}
@end

当导入上面的Category头文件,调用imageNamed时,就会调用到ln_imageNamed

#import "UIImage+Load.h"
UIImage *image = [UIImage imageNamed:@"iiii"];

输出结果为:runtime添加额外功能--加载失败

你可能感兴趣的:(Runtime作用之 方法交换)