经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
【OC底层】KVC原理
来源:cnblogs  作者:这酸爽!  时间:2018/11/6 10:08:47  对本文有异议

 定义

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

 

常见的API有:

  1. - (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
  2. - (void)setValue:(id)value forKey:(NSString *)key;
  3. - (id)valueForKeyPath:(NSString *)keyPath;
  4. - (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,上一篇我们说过只要手动调用这两个方法,KVC就会被调用。

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号