KVO&KVC

作者: 暴躁的小豆子 | 来源:发表于2019-12-19 15:48 被阅读0次

    什么是KVO?

    • KVO是key-value observing的缩写
    • KVO是Object-C对观察者设计模式的又一实现
    • KVO使用了isa混写(isa-swizzling)来实现KVO
    p1

    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类似

    相关文章

      网友评论

          本文标题:KVO&KVC

          本文链接:https://www.haomeiwen.com/subject/fifmnctx.html