• 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 的使用方法:

    • 注册
    • 使用回调方法.
    • 移除观察者
  • 相关阅读:
    Python3 调用 Ansible2.x API
    Django——form组件和ModelForm
    Python super().__init__()测试及理解
    ORACLE迁移记录
    CentOS7安装zabbix5.0
    ORACLE LINUX 7.7 安装ORACLE 11.2.0.4.0 RAC
    Spring
    【Git】clone项目&push项目没反应,Cloning into...没下载
    样式不显示,静态资源路径错误
    日常Java练习题
  • 原文地址:https://www.cnblogs.com/xuan-yuan/p/5466908.html
Copyright © 2020-2023  润新知