IOS runtime 运行时机制,方法欺骗

问题:使用URLWithString方法实例化NSURL对象时,如果传入参数为空,或者包含中文,会导致实例化失败,但是系统却没有提示。可以通过IOS的运行时机制解决这个问题。

+(void)load{

//本方法编译时执行

//得到函数URLWithString:的指针

Method urlWithStringMethod =class_getClassMethod([NSURL class],NSSelectorFromString(@"URLWithString:"));

//得到函数SHURLWithString:的指针(C方法)

Method SHURLWithString =class_getClassMethod([NSURL class],sel_registerName("SHURLWithString:"));

//交换两个函数的指针,这样,当调用函数URLWithString时就会执行SHURLWithString。

method_exchange Implementations(urlWithStringMethod, SHURLWithString);

}

+(instancetype)SHURLWithString:(NSString*)URLString{

if(URLString && [URLString isKindOfClass:[NSString class]] && URLString.length>0) {

//因为函数的指针已经交换,所以这里想要调用函数URLWithString:,则需要调用SHURLWithString:。

NSURL* url = [NSURL SHURLWithString:URLString];

if(url) {

return url;

}

else{

NSLog(@"异常:%@实例化URL失败",URLString);

NSURL* url = [NSURL SHURLWithString:@"https:www.baidu.com"];

return url;

}

}

else{

NSLog(@"异常:地址为空");

NSURL* url = [NSURL SHURLWithString:@"https:www.baidu.com"];

return url;

}

}


Demo地址https://github.com/SmallHeater/RunTime。

你可能感兴趣的:(IOS runtime 运行时机制,方法欺骗)