KVO&KVC
2019-12-19 本文已影响0人
暴躁的小豆子
什么是KVO?
- KVO是key-value observing的缩写
- KVO是Object-C对
观察者设计模式
的又一实现 - KVO使用了isa混写(isa-swizzling)来实现KVO
p1图
:当我们为对象A注册观察者的时候,实际上调用了系统的(addObserver:forKeyPath)方法,当我们注册观察者去观察对象A中的某个属性的时候,调用(addObserver:forKeyPath),系统会为我们在运行时添加NSKVONotifying_A的类,系统将原来A对象的isa指针指向NSKVONotifying_A(这里就是isa混写),NSKVONotifying_A集成A,重写了setter方法,来通知多有观察对象
重写setter方法需添加
- -(void)willChangeValueForKey:(NSString *)key;
- -(void)didChangeValueForKey:(NSString *)key;
例:
-(void)setName:(NSString *)name{
[self willChangeValueForKey:@"keyPath"];
[Super setName:name];
[self didChangeValueForKey:@"keyPath"];//会调用kvo 的回调
}
总结:
setter方法改变值KVO会生效
使用setValue:forKey:改变值KVO会生效
成员变量直接修改需要手动添加KVO才会生效
KVC
KVC是key-value coding的缩写,键值编码技术
//调用某实例的valueForKey方法,来获取跟key同名或者相似名称的实例变量的值
- -(id)valueForKey:(NSString *)key;
//设置某对象跟这个key同名或相似名实例变量的值 - -(void)setValue:(id)value forKey:(NSString *)key;
外部知道类内部私有成员变量的名称的情况下,在外界是可以通过已知的key对私有成员进行设置,获取等操作,这一点是违背了面向对象的思想
valueForKey通过key访问get方法,如果存在直接调用,结束调用流程。如果对应的访问器方法不存在的话,回去判断实例变量是否存在(跟实例变量同名或者相似名 都返回YES),假设不存在 ,系统会调用当前实例的valueForUndeFinedKey:,会抛出一个(NSUndeFinedKeyException)异常
valueForKey流程跟valueForKey类似