KVO&KVC

作者: 纳木错_grace | 来源:发表于2016-07-04 21:37 被阅读28次

    KVC

    KVC: key value coding 键值编码

    通过KVC语法,可以修改对象中的属性。
    设置值时:
    例如属性名称为name,会先查找是否存在setName方法,如果存在,调用,如果不存在,会查找是否存在_name的成员变量,如果存在,设置该变量值;
    如果不存在,查找是否存在名称为name的成员变量,如果存在,设置该值,如果不存在,并且没有做其他任何处理,程序崩溃。
    读取值时:
    例如属性名称为:name,会先查找是否存在名称为name的getter方法,如果存在,调用,如果不存在,会查找是否存在_name的成员变量,如果存在,设置该变量值,如果不存在,查找是否存在名称为name的成员变量,如果存在,设置该值,如果不存在,并且没有做其他特殊处理,程序崩溃。
    kvc设置值时有两种方法,对于成员变量,匿名类别中成员变量的值,只读属性的值(即该属性不是自定义类型的对象时,只通过这个对象的一层就找到该属性)。

    用方法:
    [car setValue:@"" forKey:@""];
    取值方法:[car valueForKey:@""];
    如果car的属性有自定义的对象,用来设置该属性对象里的属性时(多层)
    用方法:
    [car setValue:@"" forKeyPath:@""];
    取值方法:[car valueForKeyPath:@""];
    

    为了防止给没有该属性的对象设置值导致程序崩溃
    重写一下两个方法

    //重写该方法后,设置不确定key对应的value时, 程序不会崩溃
    - (void)setValue:(id)value forUndefinedKey:(NSString*)key{}
    //重写该方法后,读取不确定的key对应的value时,程序不 崩溃
    - (id)valueForUndefindKey:(NSString*)key{}
    

    KVO

    KVO :key value observing 键值观察

    对对象中的某个属性添加一个属性

    _book:是被监听的对象。
    @"price":是被监听对象的属性
    options选项可以观察旧值和新值
    观察者一般用self来
       [_book addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld | NSKeyValueObservingOptionInitial context:nil];
    
    //重写的方法,当属性改变,会调用该方法
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
        //属性改变时,change中记录了一些值,options不同,其中的值也不同
        NSLog(@"%@", change);
        if (object == _book && [keyPath isEqualToString:@"price"]) {
            self.priceTF.text = [NSString stringWithFormat:@"%ld", _book.price];
        }else{
            //如果是其他情况,交给父类处理
            [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
        }
        
        ```
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    相关文章

      网友评论

          本文标题:KVO&KVC

          本文链接:https://www.haomeiwen.com/subject/pvxhjttx.html