zoukankan      html  css  js  c++  java
  • 【OC底层】KVC原理

     定义

    KVC的全称是Key-Value Coding,俗称“键值编码”,可以通过一个key来访问某个属性

    常见的API有:

    - (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
    - (void)setValue:(id)value forKey:(NSString *)key;
    - (id)valueForKeyPath:(NSString *)keyPath;
    - (id)valueForKey:(NSString *)key;

    setValue:forKey:的原理

    解析:当我们执行 setValue 的时候,要会去判断这个对象有没有 setKey 和 _setKey 这两个方法,按顺序判断,如果有就调用,如果没有就会调用对象的accessInstanceVariablesDirectly方法去判断能不能去访问成员变量,如果不能就直接抛异常,能的话,再去按顺序访问 _key、_isKey、key、isKey 的成员变量,找到就赋值,没找到就抛异常.

    accessInstanceVariablesDirectly :是否允许访问成员变量,默认YES

     这个方法有个应用场所就是如果你自己写框架,你的一些私有的变量不想被外部通过KVC的方式去修改,就可以重写这个方法,返回 NO 即可!

    valueForKey:的原理

     

    取值和赋值差不多,就是判断的获取方法多了两个而已。就是 getKey、isKey 

    通过KVC修改属性值或者成员变量值会触发KVO吗? 

     答案是肯定可以的。因为无论你对象有没有set方法,KVC底层都会调用 willChangeValueForKey 和 didChangeValueForKey上一篇我们说过只要手动调用这两个方法,KVO就会被调用。

     如果有set方法,也会调用该set方法。

     KVC技术是会破坏面向对象思想的!

  • 相关阅读:
    Python随笔之字典Dict
    Python随笔之列表List
    Python基础整理,懒得分类了,大家对付看看吧
    shell批量推送公钥脚本
    Xcode 切换target 之后打包失败
    百度导航sdk错误日志
    前端项目中去掉替换双引号
    taro3.x项目中引用taro-ui以及taro-iconfont-cli
    taro
    JS中some() every() forEach() map() filter()的区别
  • 原文地址:https://www.cnblogs.com/xgao/p/9910304.html
Copyright © 2011-2022 走看看