iOS KVC 和 KVO 区别简单总结

KVC:

key value coding,键值编码.是一种通过使用属性的名称(key)来间接访问对象属性的方法.这个方法可以不用通过 setter/getter 方法来访问对象的属性.该方法使用的实质是,是使用 valueForKey来代替 getter 方法, setValueForKey 来代替 setter 方法.

KVC 常用的方法:

       - (id)ValueForKey:   通过 key 值读取对象的属性

       -(id)setValue: forKey: 通过 key 的值来使用属性

       -(id)setNilValueForKey: 将给的 key 字对应的 value 值设置为 nil

       -(id)setValueForUndefinedKey: 错误拦截,在 KVC 没有找到 key 值时调用.

KVC 的特点:

  • 既可以取值也可以赋值.
  • KVC 是一种间接传值,该方式有利于解耦合.
  • KVC 可以对只读属性/私有属性赋值
  • KVC 有自动装箱(自动类型转换)的功能.
  • 支持键值路径

键值路径:说白了就是对嵌套比较深的key 取值.主要表现在两个方法之间的区别setValue: forKey: 和 setValue: forKeyPath:

setValue: forKey: 方法,在使用的时候只是在本层中查找 key 值进行赋

setValue: forKeyPath: 方法在使用的时候,根据传进来的 key 值在整个项目中查找.直到查找到该 key 值后对其赋值.

  • KVC提供了avg,sum,max,min,count 等函数,在可以直接使用

KVC 的缺点

  • 由于 KVC 是通过 key 字符串进行属性的访问的,所以编译器无法检测说给的 key 值的正确性
  • KVC 的执行效率要比 setter 和 getter 方法的低,因为 KVC 要先解析说给的 key 值,然后才去访问对应的属性.

KVC 的实现原理:

       KVC 首先根据传入的 anyKey(以此 key 为例)值去查找对象中是否含有anyKey的方法,找到了就直接使用,如果没有找到就继续查找是否含有anyKey的属性,找到的话直接使用,如果没有找到,则试图调用 setValueForUndefineKey,如果该方法没有实现,则会报错.

       注: KVC 查找anyKey的方法和属性的时候,不仅仅查找anyKey,还会查找 _anyKey , getAnyKey _getAnyKey

 

 

 

KVO:

       Key value observing,键值监听,通俗点说就是当指定的对象的属性改变的时候,对象就会接到通知.也就是说,每次指定的对象发生改变的时候,对应的监听者就会接收到信息.

KVO 的使用原理:

KVO:键值监听.是 cocoa 框架实现的观察者模式,一般和 KVC 搭配使用.通过 KVO 可以监测一个值的变化.是一个一对多的关系,即一个值发生了变化,会通知所有的观察者.

KVO 的使用方法:

  • 注册
  • 使用回调方法.
  • 移除观察者

 

posted @ 2016-05-12 15:05  Andy5020  阅读(336)  评论(0编辑  收藏  举报