一、Key Value Coding 协议
Key Value Coding是cocoa的一个基本组成部分。
KVC的操作方法都是由NSKeyValueCoding协议提供,而NSObject实现了这个协议,所以几乎所有的对象都支持KVC操作。
通过KVC调用对象访问对象的属性时,如:[self valueForKey:@"key"]执行的步骤
1.首先会查找对象是否带有key属性的set方法,如果没有找到
2.继续查找对象是否带有key这个实例变量,如果没有找到
3.调用方法-(id) valueForUndefinedKey:和setValue: forUndefinedKey:这些方法的默认实现都是抛出一个NSUndefinedKeyEXception异常错误,根据需要重写它们
什么是键-值,什么是键路径
键:一个字符串,与模型的属性名相同
值:模型的属性对应的值
键值路径:是一个用点作分隔符的键组成的字符串。通过键路径可以指定对象的任意深度的路径,使其指向相关对象的特定属性如"person.age"
KVC常用操作方法
动态设置:
setValue:属性值 forKey 属性名
setValue:属性值 forKeyPath:属性路径(用于复合路径,person.account)
动态取值
valueForKey:属性名
valueForKeyPath:属性名
字典转模型 常用到的方法
setValuesForKeysWithDictionary:
这个方法会依次调用字典中的键值对,进行赋值, 每找到一个属性,就会带调用另一个方法
setValue:属性值 forKey属性名
如果找不到对应的属性,会调用
setValue: forUndefinedKey:
默认这个方法是返回一个异常错误,需要重写这个方法,执行操作
二、KVO
什么是KVO
Key Value Observing ,它是一种观察者模式,用于监听属性的变化,相应的objects会被通知。
实现方式
KVO是通过OC的运行时实现的,当第一次观察某个object时,
runtime会创建一个新的继承自object对应类的派生类,在这个新的子类中,
它重写了setter方法(方法内添加通知机制),系统将object的isa指针指向这个派生类,
这个object对象就被巧妙的成为了该派生类的对象,
因此调用对象的setter方法的时候就会调用重写的setter方法,从而激活了键值通知机制。
此外,派生类还重写了dealloc方法释放资源。