利用runtime 进行方法的交换 --Method Swizzle
Method Swizzle
1.例如通常转url的字符窜中含有中文的话,url转完后会变为nil,为了整个项目方便替换,通常会使用到runtime进行方法的替换。如下,在viewdidload中
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
NSURL * url = [NSURL URLWithString:@"www.baidu.com/中文"];
NSLog(@"%@",url);
}
2.新建一个url的分类实现方法的交换。
#import "NSURL+CCUrl.h"
#import <objc/runtime.h>
@implementation NSURL (CCUrl)
+(void)load
{
Method urlWithStr = class_getClassMethod(self, @selector(URLWithString:));
Method New_urlWithStr = class_getClassMethod(self, @selector(CC_UrlWithStr:));
method_exchangeImplementations(urlWithStr, New_urlWithStr);
}
+(instancetype)CC_UrlWithStr:(NSString *)str
{
NSURL * url = [self CC_UrlWithStr:str];
if (!url) {
url = [self CC_UrlWithStr:[str stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]];
}
return url;
}
@end
3.这样viewcontroller控制中再次用urlWithString时候,就会调用到分类中自己定义的CC_urlwithString.