系统自带的URLWithString:方法如果我们参数传入的包含有中文,那么url就为空,如果我们想自己定制一个这样的方法,比如说如果通过这个方法调用出来的url为nil的话,就让程序崩溃,那么我们可以在调用URLWithString:方法的过程中里面加一个断言
所以我们可以这么做,创建一个NSURL的分类,然后在分类的load方法中去进行方法的交换,其中class_getClassMethod做的就是返回一个指向给定类的给定类方法的数据结构的指针
+(void)load
{
/*
SEL 找到了IMP ,这个IMP才是函数的指针
*/
//寻找方法
Method urlWithString = class_getClassMethod(self, @selector(URLWithString:));
Method zx_urlWithString = class_getClassMethod(self, @selector(ZX_URLWithString:));
//交换系统原生的方法和我们写的方法
method_exchangeImplementations(urlWithString, zx_urlWithString);
}
+(instancetype)ZX_URLWithString:(NSString *)URLString
{
//这里实际调用的就是系统原生的方法了
NSURL * url = [NSURL ZX_URLWithString:URLString];
NSAssert(url!=nil, @"url为nil!");
return url;
}
外界进行调用
NSURL * url = [NSURL URLWithString:@"http://www.baidu.com/中"];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
NSLog(@"%@",request);