KVO&KVC

2019-12-19  本文已影响0人  暴躁的小豆子

什么是KVO?

p1

p1图:当我们为对象A注册观察者的时候,实际上调用了系统的(addObserver:forKeyPath)方法,当我们注册观察者去观察对象A中的某个属性的时候,调用(addObserver:forKeyPath),系统会为我们在运行时添加NSKVONotifying_A的类,系统将原来A对象的isa指针指向NSKVONotifying_A(这里就是isa混写),NSKVONotifying_A集成A,重写了setter方法,来通知多有观察对象

重写setter方法需添加

例:

-(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同名或者相似名称的实例变量的值

外部知道类内部私有成员变量的名称的情况下,在外界是可以通过已知的key对私有成员进行设置,获取等操作,这一点是违背了面向对象的思想

valueForKey

通过key访问get方法,如果存在直接调用,结束调用流程。如果对应的访问器方法不存在的话,回去判断实例变量是否存在(跟实例变量同名或者相似名 都返回YES),假设不存在 ,系统会调用当前实例的valueForUndeFinedKey:,会抛出一个(NSUndeFinedKeyException)异常

valueForKey

流程跟valueForKey类似

上一篇 下一篇

猜你喜欢

热点阅读