**************
KVC 和 KVO
两种设计模式
KVC
赋值 一种赋值方式
字符串赋值
- (void)setValue:(id)value forKey:(NSString *)key;
对属性进行赋值
- (id)valueForKey:(NSString *)key;
获取属性的值
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
- (id)valueForKeyPath:(NSString *)keyPath;
属性是自定义对象 属性中的属性 类的嵌套
- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;
批量对属性赋值
KVC赋值和取值的时候 会依次:
找属性为key的进行赋值
找不到 会找_key的成员变量
找不到 会找key的成员变量
找不到 会找下边对应的方法 再找不到就会崩
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
- (id)valueForUndefinedKey:(NSString *)key;
这两个方法是在model中重写的
KVO
键值监听
监听值什么时候变化
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;
给对象添加监听
options 常用到XXnew XXold
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
observer要实现CocoaLigature0 这个方法 object 的keypath的值改变时 调用这个方法
(__bridge NSString *)context;
用这个给通用指针强转
change[@"new"] 新值
change[@“old”] 旧值
看监听的options参数 对不上的话 值就是null
KVO与通知中心:
他俩非常相似 又不太一样
通知中心是观察某一个字符串 任意对象都可以发 一对对出现的
KVO是A对象观察B对象的某一个属性 监听值的改变