iOS运行时方法替换(方法欺骗)

runtime高级用法,使用时请注意注释,慎用。

如下例,希望在系统方法加一层判断,通过方法替换将自定义方法替换掉系统方法。

    NSURL *url = [NSURL URLWithString:@"http://www.baidu.com/中文"];
    NSLog(@"%@",url);
#import "NSURL+url.h"
#import 

@implementation NSURL (url)
// 装载时加载  main函数调用之前
+(void)load
{
    // 交换方法实现的IMP
    // method_exchangeImplementations  交换方法IMP实现
    // class_getClassMethod            获取类方法
    // class_getInstanceMethod         获取对象方法
    
    // 分别获取两个方法
    Method URLMet = class_getClassMethod(self, @selector(URLWithString:));
    Method HYMet = class_getClassMethod(self, @selector(HY_URLWithStr:));
    
    // 交换方法实现
    method_exchangeImplementations(URLMet, HYMet);
    
}

// 方法实现
+(instancetype)HY_URLWithStr:(NSString *)str
{
    NSURL *url = [NSURL HY_URLWithStr:str];
    if (url == nil) {
        NSLog(@"这个url为nil");
    }
    return url;
}

@end

你可能感兴趣的:(iOS运行时方法替换(方法欺骗))