KVO&KVC

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 *)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)