交换方法时找不到选择器

时间:2018-09-29 02:34:43

标签: ios objective-c

尝试交换方法时遇到问题:

@implementation LoginViewModel

+ (void)load {

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Method fromMethod = class_getClassMethod([NSURL class], @selector(URLWithString:));
        Method toMethod = class_getClassMethod([self class], @selector(TempURLWithString:));
        method_exchangeImplementations(fromMethod, toMethod);
    }
});

}

+ (NSURL *)TempURLWithString:(NSString *)URLString {
    NSLog(@"url: %@", URLString);
    return [LoginViewModel TempURLWithString:URLString];
}

当调用[NSURL URLWithString:]时,我成功地在交换的方法TempURLWithString:中获取了参数。但是从原始实现返回结果时,它崩溃了:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[LoginViewModel 
URLWithString:relativeToURL:]: unrecognized selector sent to class 
0x10625ff80'

我想做的是在初始化NSURL时修改url字符串,任何人都可以给我一些帮助,谢谢!

1 个答案:

答案 0 :(得分:2)

+[NSURL URLWithString:]的实现基本上如下:

+ (NSURL *)URLWithString:(NSString *)string {
    return [self URLWithString:string relativeToURL:nil];
}

这里要注意的重要一点是self指向NSURL类。

但是,当您调用[LoginViewModel TempURLWithString:URLString]时,原始self方法中的URLWithString:现在是对LoginViewModel类的引用,这意味着当原始实现调用{ {1}},该呼叫将调度到不存在的[self URLWithString:string relativeToURL:nil](因此例外)。

您还可以通过在课程中添加+[LoginViewModel URLWithString:relativeToURL:]的存根来解决此问题,该存根仅将调用转发给URLWithString:relativeToURL

+[NSURL URLWithString:relativeToURL:]