正文
];
当我们没有进行编码的时候,这个url在编译的时候是有效的,但是一旦运行起来,这个url就会变为nil。因为检测不到这是一个无效的url,会继续发送网络请求。
怎么办呢?在下面用if做一个判断?可是要在每一个url下面都做判断。这时候最先想到的一定是重写。
创建一个url的分类,重写
URLWithString:<#(nonnull NSString *)#>
但是,我们看:
+(instancetype)URLWithString:(NSString *)URLString
{
// 首先创建一个URL
NSURL * url= ????????
if (url==nil) {
NSLog(@"有问题");
}
return url;
}
我们该怎么创建呢,死循环了是不是,所以runtime就起作用了。
在分类中自定义一个方法
+(instancetype)TY_URLWithStr:(NSString *)Str;
{
NSURL * url =[NSURL URLWithString:Str];
if (url == nil) {
NSLog(@"是空!!!!");
}
return url;
}
但是我们并不是要每一次创建url都调用这个方法,因为程序里有很多创建url的地方,我们还继续使用系统自带的方法。在分类中实现
load
方法,当程序加载这个类的时候最先调用这个方法。导入头文件,开始进行方法交换。
+(void)load
{
// Method : 成员方法
//class_getClassMethod 拿到类方法
//class_getInstanceMethod 拿到对象方法
Method URLWithStr = class_getClassMethod([NSURL class], @selector(URLWithString:));
Method TYURLWithStr = class_getClassMethod([NSURL class], @selector(TY_URLWithStr:));
// 开始交换方法
method_exchangeImplementations(URLWithStr, TYURLWithStr);
}
记得将上面我们自定义的方法中创建url的方法改变回去,不然再次死循环,改为
+(instancetype)TY_URLWithStr:(NSString *)Str;
{
NSURL * url =[NSURL TY_URLWithStr:Str];
if (url == nil) {
NSLog(@"是空!!!!");
}
return url;
}
是不是有种一叶落而知天下秋的感觉。
(3)遍历属性列表简化序列化
oc的序列化在这里就不多说了,让我们来说一种常见的情况,当需要归档的属性过多时,我们需要一条条的写出来,十分繁琐,有没有可能简化一些呢,如果单纯的用for循环去做,那么不同的类型该怎么处理呢,这时候我们的runtime又来了。首先创建一个Person类,多弄一些虚拟属性。
// .h
@property(nonatomic,strong) NSString * name;
@property(nonatomic,strong) NSString * name1;
@property(nonatomic,assign) int age;
@property(nonatomic,assign) int age1;
@property(nonatomic,assign) double age2;
// .m
-(void)encodeWithCoder:(NSCoder *)Coder
{
}
-(instancetype)initWithCoder:(NSCoder *)aDecoder
{
self=[super init];
if (self) {
}
return