KVC和KVO

ngnmg

KVC底层实现

  • 当一个对象调用setValue方法,方法内部会做以下操作:
    • 检查是否存在相应key的set方法,如果有就调用
    • 如果没有就查看有没有与key同名并且带下划线的属性,如果有就直接赋值。
    • 如果没有,就继续查看有没有与key同名不带下划线的属性,如果有就直接赋值
    • 如果还是没有找到,就调用setValue:forUndefinedKey:方法

KVO底层实现

  • kvo基于runtime机制实现,使用了isa混写,当一个对象(假设是person对象,person对象的类是MYPerson类)的属性值发生变化时,系统会自动产生一个类继承自MYPerson:NSKVONotifying_MYPerosn,在这个类的setAge方法里面,调用[super setAge:age] [self willChangeValueForKey:@"age"] 和[self
    didChangeValueForKey:@"age"],这两个方法会调用 automaticallyNotifiesObserversForKey

  • 同时派生类还重写了 class 方法以“欺骗”外部调用者它就是起初的那个类。然后系统将这个对象的 isa 指针指向这个新诞生的派生类,因此这个对象就成为该派生类的对象了,因而在该对象上对 setter 的调用就会调用重写的 setter,从而激活键值通知机制。此外,派生类还重写了 dealloc 方法来释放资源。

KVO的优缺点

  • 优点

    • 能够提供一种简便的方法来实现两个对象之间的同步
    • 能够对非我们创建的对象,即内部对象的状态改变做出响应,而且不需要改变内部对象的实现
    • 能够提供观察的属性的新值以及先前值
  • 缺点

    • 我们观察的属性必须使用string来定义,因此在编译器不会出现警告以及检查
    • 对属性进行重构将会导致我们的观察代码不可再用
    • 当释放观察者需要移除观察者
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在编程中,最常见的就是程序的流程取决于你所使用的各种变量和属性的值,根据变量和属性的值确定后面运行的代码,有时会检...
    pro648阅读 5,613评论 2 27
  • 目录:1.KVC用法;2.KVC和对象的setter、getter方法的区别;3.key和keyPath的区别;4...
    伦伦子_f7b3阅读 3,754评论 0 1
  • KVC:键-值编码,使用字符串直接访问对象的属性。 KVO:键值观察机制,它提供了观察某一属性变化的方法 KVC底...
    司夜阅读 1,486评论 0 0
  • 关于KVC KVC是什么? Key-Value Coding,即键值编码。它是一种不通过存取方法,而通过属性名称字...
    Wang66阅读 14,360评论 4 39
  • 参考链接:[精辟]KVO 和 KVC 的区别和用法,干货!!!iOS开发技巧系列---详解KVCKVC的优点和缺点...
    大布溜阅读 1,711评论 0 1

友情链接更多精彩内容