应用场景有很多,因为系统很多方法是不报错误的,我们就可以换成自己的方法,加入一些提示或者判断
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSURL *url=[NSURL URLWithString:@"www.baidu我"];
NSLog(@"%@",url);
}
#import "NSURL+Help.h"
#import <objc/message.h>
@implementation NSURL (Help)
/*
runtime 方法交换原理
selectorA 指向 IMPa
selectorB 指向 IMPb
交换之后
selectorA 指向 IMPb
selectorB 指向 IMPa
*/
//load方法会在main方法之前调用,在类加载到内存的时候调用 只会调用一次
+(void)load{
//获取类方法
Method system= class_getClassMethod(self, @selector(URLWithString:));
Method myMethod= class_getClassMethod(self, @selector(myURLWithString:));
//交换方法
method_exchangeImplementations(system, myMethod);
}
//判断url 是否为空
+(NSURL *)myURLWithString:(NSString *)str{
//这个地方调用自己的方法,调用系统的,就指向自己的方法实现,会造成死循环
NSURL *url=[NSURL myURLWithString:str];
if (url == nil) {
NSLog(@"url为空");
}
return url;
}
@end