KVC简介
KVC(Key-value coding)键值编码
指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值。而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性。
常用方法:
- (nullable id)valueForKey:(NSString *)key; //直接通过Key来取值
- (void)setValue:(nullable id)value forKey:(NSString *)key; //通过Key来设值
- (nullable id)valueForKeyPath:(NSString *)keyPath; //通过KeyPath来取值
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath; //通过KeyPath来设值
作者:黑暗中的孤影
链接:https://www.jianshu.com/p/45cbd324ea65
valueForKey:的原理
查找key获取value值的流程图
1-顺序查找getKey/key/isKey/_key这4个方法,找到就调用返回value值
2-没找到,就调用accessInstanceVariablesDirectly,是否允许直接访问对象变量
3-假如accessInstanceVariablesDirectly为Yes,就顺序查找成员变量_key,_isKey,key,isKey,找到就返回value值,否则就调用valueForUndefinedKey:并抛出异常.
4-假如accessInstanceVariablesDirectly为NO,调用valueForUndefinedKey:并抛出异常.
setValue:forKey:的原理
根据key设置value值的流程图
1-顺序查找setKey:,_setKey:这2个方法,找到就调用设置value值
2-没找到,就调用accessInstanceVariablesDirectly,是否允许直接访问对象变量
3-假如accessInstanceVariablesDirectly为Yes,就顺序查找成员变量_key,_isKey,key,isKey,找到就直接赋值value值,否则就调用setValue:forUndefinedKey:并抛出异常.
4-假如accessInstanceVariablesDirectly为NO,调用setValue:forUndefinedKey:并抛出异常.
KVO
key value observing (键值监听 /观察者模式)/是一种回调机制
在某个对象注册监听者后/在被监听的对象发生改变时/对象会发送一个通知给监听者/以便监听者执行回调
就是每次指定的被观察的对象的属性被修改后 /KVO就会自动通知响应的观察者
KVO和KVC一样都依赖于Runtime的动态及时 /都属于键值编程而且底层实现机制都是isa-swizzling
系统利用Runtime主动生成一个子类对象,NSKVONotifying_xxx类,改写属性set方法大概如下所示:
willChangeValueForKey:即将改变值
super setXXX:父类设置值
didChangeValueForKey:同时通知监听器对象属性改变了