【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 的成员变量,找到就赋值,没找到就抛异常.spa

 

accessInstanceVariablesDirectly :是否容许访问成员变量,默认YEScode

 这个方法有个应用场所就是若是你本身写框架,你的一些私有的变量不想被外部经过KVC的方式去修改,就能够重写这个方法,返回 NO 便可!对象

valueForKey:的原理

 

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

 

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

 答案是确定能够的。由于不管你对象有没有set方法,KVC底层都会调用 willChangeValueForKey 和 didChangeValueForKey上一篇咱们说过只要手动调用这两个方法,KVO就会被调用。get

 若是有set方法,也会调用该set方法。class

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

相关文章
相关标签/搜索