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

    什么是KVO? KVO是key-value observing的缩写 KVO是Object-C对观察者设计模式的又...

  • KVO&KVC

    KVO KVO的全称是Key-Value Observing,俗称“键值监听”,可以用于监听某个对象属性值的改变,...

  • KVO&KVC

    KVO 是(Key-valueObserve) Objective-C 对观察者模式(Observer Patte...

  • KVO&KVC浅谈

    在谈论KVO和KVC之前,先引出几个问题 问题一:iOS用什么方式实现KVO,你可以理解成KVO本质是什么? 1....

  • iOS知识体系总结-KVO&KVC

    注意:更新内容会同步到GitHub iOSWiki-知识体系总结 总结-KVO&KVC iOS知识点/KVO&KV...

  • iOS底层原理-KVO&KVC

    KVO&KVC KVO:键值监听,可以用于监听某个对象属性值的改变 以上是最简单的KVO的使用,通过打印perso...

  • 第九章、KVO&KVC相关

    一、为什么都俗称KVO技术为黑魔法 内部神秘、外观简洁。 二、阐述系统KVO的实现原理 当观察一个对象时,一个新的...

  • iOS开发面试-八个考点, 带你全面掌握KVO&KVC

    原文地址[https://juejin.cn/post/7039296166789382174] 1. KVO的实...

网友评论

      本文标题:KVO&KVC

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