runtime更换系统URL方法

使用runtime更换系统URLWithString:方法,新方法在URLWithString:基础上新增判断url是否为空的功能,在实现之前需要了解一些runtime的知识点。
1. load类方法:该方法在系统加载二进制文件之前调用,每一个类里面都可以实现该方法
2. oc的方法有两个元素为sel 和 imp。sel为方法地址,imp为方法实现
3. 运行时方法(交换两个方法的实现)
method_exchangeImplementations(<#Method m1#>, <#Method m2#>)
4. 运行时方法(获取一个方法的实现)
class_getClassMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>)

最终load方法中的代码为:
Method URLWithStr = class_getClassMethod([self class], @selector(URLWithString:));
Method HKURLSTR = class_getClassMethod([self class], @selector(HK_URLWSTR:));
//交换
method_exchangeImplementations(URLWithStr, HKURLSTR);

以上代码是为将系统的URLWithString:更换为自定义的HK_URLWSTR

接下来需要写HK_URLWSTR这个方法
+(instancetype)HK_URLWSTR:(NSString *)str{
//创建URL
NSURL * url = [NSURL HK_URLWSTR:str];//走到了系统的方法实现!!
if (!url) {
NSLog(@"哥么nil");
}
return nil;
}

注意
该方法中创建url方法为HK_URLWSTR,不能使用URLWithString:,因为两个方法的实现已经替换,调用URLWithString:实际上是调用了HK_URLWSTR:的实现,就是掉自己,所以会递归,进入死循环

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值