交换方法时找不到选择器



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

@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字符串,任何人都可以给我一些帮助,谢谢!

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

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

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

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

您还可以通过向类添加用于URLWithString:relativeToURL的存根来解决此问题,该存根只是将调用转发到+[NSURL URLWithString:relativeToURL:]

@implementation LoginViewModel
+ (NSURL *)URLWithString:(NSString *)string relativeToURL:(nullable NSURL *)relativeURL {
return [NSURL URLWithString:string relativeToURL:relativeURL];
}
@end

最新更新