美文网首页
iOS运行时方法替换(方法欺骗)

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

作者: 阳仔_hy | 来源:发表于2018-06-23 20:06 被阅读0次

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

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

        NSURL *url = [NSURL URLWithString:@"http://www.baidu.com/中文"];
        NSLog(@"%@",url);
    
    #import "NSURL+url.h"
    #import <objc/runtime.h>
    
    @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运行时方法替换(方法欺骗)

          本文链接:https://www.haomeiwen.com/subject/gfhdyftx.html