runtime高级用法,使用时请注意注释,慎用。
如下例,希望在系统方法加一层判断,通过方法替换将自定义方法替换掉系统方法。
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com/中文"];
NSLog(@"%@",url);
#import "NSURL+url.h"
#import <objc/runtime.h>
@implementation NSURL (url)
// 装载时加载 main函数调用之前
+(void)load
{
// 交换方法实现的IMP
// method_exchangeImplementations 交换方法IMP实现
// class_getClassMethod 获取类方法
// class_getInstanceMethod 获取对象方法
// 分别获取两个方法
Method URLMet = class_getClassMethod(self, @selector(URLWithString:));
Method HYMet = class_getClassMethod(self, @selector(HY_URLWithStr:));
// 交换方法实现
method_exchangeImplementations(URLMet, HYMet);
}
// 方法实现
+(instancetype)HY_URLWithStr:(NSString *)str
{
NSURL *url = [NSURL HY_URLWithStr:str];
if (url == nil) {
NSLog(@"这个url为nil");
}
return url;
}
@end