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<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];
    }
    
    ```
}

















最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容