专栏名称: 黑白灰的绿i
iOS
目录
相关文章推荐
上海少年儿童图书馆  ·  少图讲堂丨幸福研习堂:如何理解儿童画的弦外音? ·  22 小时前  
新东方家庭教育  ·  损害孩子大脑的4种坏习惯:父母再难,也要帮孩 ... ·  昨天  
丁香妈妈  ·  别再乱买绘本了, 0~6 岁建议这样选和读 ·  2 天前  
51好读  ›  专栏  ›  黑白灰的绿i

iOS --runtime理解与应用

黑白灰的绿i  · 掘金  ·  · 2017-12-13 06:02

正文

请到「今天看啥」查看全文


];

当我们没有进行编码的时候,这个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;
}

是不是有种一叶落而知天下秋的感觉。

teatime.gif

(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






请到「今天看啥」查看全文