举例 在创建了如下代码
NSString *str=nil;
NSURL *url =[NSURL URLWithString:str];
NSLog(@"%@",url);
但是想使用自己的方法并对传入的字符串做为空判断
举例 自己写了一个方法
+ (instancetype)SJUrlWithStr:(NSString *)str 替代系统方法
[NSURL URLWithString:]
但是如果项目现在已经进行到了后期 就会涉及到很多界面要导入头文件 并修改使用这个方法 很不方便
那么可以自己新建一个URL的分类 在分类中使用运行时交换两个系统的方法和自己的方法快速的实现方法交换
#import "NSURL+Extension.h"
#import <objc/message.h>
@implementation NSURL (Extension)
+ (void)load{
//获取系统方法结构体
Method system = class_getClassMethod([self class], @selector(URLWithString:));
//获取自己方法结构体
Method own = class_getClassMethod([self class], @selector(SJUrlWithStr:));
// 交换方法 系统的 URLWithString 和自己的 SJUrlWithStr
//交换自己方法和系统方法
method_exchangeImplementations(system, own);
//以后再使用 URLWithString 的时候 其实是在调用SJUrlWithStr
}
+ (instancetype)SJUrlWithStr:(NSString *)str {
if (str==nil) {
NSLog(@"字符串为空");
return nil;
}
// 下面的 SJUrlWithStr 其实是使用了 URLWithString
NSURL *url = [NSURL SJUrlWithStr:str];
return url;
}
@end
该博客介绍了如何通过Objective-C的运行时方法交换技术,在`NSURL`类中添加一个分类,以替换系统方法`URLWithString:`。当传入的字符串为空时,会打印错误信息并返回nil,避免了因空字符串导致的潜在问题。这种方法在后期项目中修改大量代码的不便,提供了一种优雅的解决方案。
7888

被折叠的 条评论
为什么被折叠?



