美文网首页
Objective-C Runtime方法替换引发的死循环

Objective-C Runtime方法替换引发的死循环

作者: 树懒啊树懒 | 来源:发表于2019-10-08 10:42 被阅读0次

当执行下面问题代码:

NSURL *url = [NSURL URLWithString:@"https://www.baidu.com/中文字符串"];
NSLog(@"url:%@",url);

打印日志:显示null
2019-09-03 18:09:59.087098+0800 RACUse[1761:2943445] url:(null)

所以当我们对类似系统方法进行拦截或者优化时, 往往使用运行时的方法交换

1.创建一个URL的扩展类NSURL+KKURL.h / NSURL+KKURL.m

  1. 导入runtime
    2.在+ (void) load { }方法 中添加代码
@implementation NSURL (KKURL)

+ (void)load {
//系统url方法
    Method urlM = class_getClassMethod([self class], @selector(URLWithString:));
//新的url方法
    Method urlNewM = class_getClassMethod([self class], @selector(KKURLWithString:));
//交换方法
    method_exchangeImplementations(urlM, urlNewM);
}


+ (nullable instancetype)KKURLWithString:(NSString *)URLString {
    NSURL *url = [self KKURLWithString:URLString];
    if (url) {
        return url;
    } else {
        NSLog(@"无效url");
        return [NSURL new];
    }
}

我们注意到KKURLWithString:里面为啥是:

    NSURL *url = [self KKURLWithString:URLString];

而不是:

    NSURL *url = [self URLWithString:URLString];//会导致循环
image.png

其实现在URLWithString:URLString 调用的是KKURLWithString:URLString方法,
KKURLWithString:URLString调用的是URLWithString:URLString方法,

所以下面代码会导致死循环:

+ (nullable instancetype)KKURLWithString:(NSString *)URLString {
    NSURL *url = [self URLWithString:URLString];

...
}

相反,下面方法正常:

+ (nullable instancetype)KKURLWithString:(NSString *)URLString {
    NSURL *url = [self KKURLWithString:URLString];
...
}

相关文章

网友评论

      本文标题:Objective-C Runtime方法替换引发的死循环

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