KVC:
- kvc:Key Value Coding,即键值编码,可以动态设置的对象的属性值。
- 动态设置设置属性,优先调用settet方法,没有实现则搜索成员变量_属性,仍没有找到则直接搜索成员变量属性,如果以上都没有找到则会调用setValue:forUndefineKey方法。
- 动态读取属性,跟设置属性类似。优先调用getter方法,不存在则找成员变量_属性,还不存在则直接搜索成员变量属性,都没找到则调用valueforUndefineKey:方法。
- 复合路径和简单路径
- 简单路径只有一层(表示你只能读写第一层)
- 复合路径有多层(比如:你的类里面包含着其他类,其他类也有着属性,你可以直接读写其他类的属性)
setValue:forKeyPath:
注意:
- 搜索过程中不管这些方法、成员变量是否是私有都可以被读取,不会因为私有二导致失败。
- 如果调用了setValue:forUndefineKey和valueforUndefineKey:这两个方法,而你又没有重写,系统会崩溃并且抛出异常
KVO:
- kvo:Key Value Observing,它能够观察一个对象键值变化。
- KVO是建立在KVC之上
我们不需要写过多的代码,只需要注册这个监听,就能很好的监听某一属性的值的变化,然后做出对应的操作。
//添加观察者
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;
[被观察者的对象 addObserver:观察者 forKeyPath:@"被观察者的属性" options:NSKeyValueObservingOptionNew(更新的值) | NSKeyValueObservingOptionOld(更新前的值) context:nil];
//键值修改时触发回调
//参数1:属性 名称 参数2:被观察者对象 参数3:修改的值
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;
//移除观察者
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;