KVC 和 KVO

KVC(Key-value-coding):即键-值编码,提供一种机制来间接访问对象的属性

无论是Swift还是Objective-C,KVC的定义都是对NSObject的扩展来实现的(Objective-c中有个显式的NSKeyValueCoding类别名,而Swift没有,也不需要)所以对于所有继承了NSObject在类型,都能使用KVC(一些纯Swift类和结构体是不支持KVC的)

1. [setValue: forKey] 的作用:
  • 对类的私有变量进行赋值
  • 字典转模型(注意:字典中的 key 一定要在模型中有对应的属性, 如果一个模型中包含了另外的模型对象,是不能转化成功的,通过 kvc 转化模型中的模型是不能转化成功的)

可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值。而不需要调用明确的存取方法。这样就可以在运行时动态在访问和修改对象的属性。而不是在编译时确定,这也是iOS开发中的黑魔法之一

下面是KVC最为重要的四个方法:

- (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来设值
+ (BOOL)accessInstanceVariablesDirectly;
//默认返回YES,表示如果没有找到Set方法的话,会按照_key,_iskey,key,iskey的顺序搜索成员,设置成NO就不这样搜索
- (BOOL)validateValue:(inout id __nullable * __nonnull)ioValue forKey:(NSString *)inKey error:(out NSError **)outError;
//KVC提供属性值确认的API,它可以用来检查set的值是否正确、为不正确的值做一个替换值或者拒绝设置新值并返回错误原因。
- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key;
//这是集合操作的API,里面还有一系列这样的API,如果属性是一个NSMutableArray,那么可以用这个方法来返回
- (nullable id)valueForUndefinedKey:(NSString *)key;
//如果Key不存在,且没有KVC无法搜索到任何和Key有关的字段或者属性,则会调用这个方法,默认是抛出异常
- (void)setValue:(nullable id)value forUndefinedKey:(NSString *)key;
//和上一个方法一样,只不过是设值。
- (void)setNilValueForKey:(NSString *)key;
//如果你在SetValue方法时面给Value传nil,则会调用这个方法
- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys;
//输入一组key,返回该组key对应的Value,再转成字典返回,用于将Model转到字典。
KVC 是怎么找到 key 的:

当调用[self valueForKey:@"someKey"]的时候,首先会查找对象是否带有 someKey 这个方法,如果没有找到,会继续查找对象是否带有 someKey 这个实例变量,如果还是没有找到,会试图调用 -(id)valueForUndefinedKey: 这个方法,如果这个方法没有被实现的话,程序会抛出 NSUndefinedKeyException: 异常错误.(注:Key-Value Coding查找方法的时候,不仅仅会查找someKey这个方法,还会查找getsomeKey这个方法,前面加一个get,或者_someKey以及_getsomeKey这几种形式。同时,查找实例变量的时候也会不仅仅查找someKey这个变量,也会查找_someKey这个变量是否存在),valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象能够在错误发生前,有最后的机会响应这个请求

KVO(key-value-observing):

KVO 就是基于 KVC 实现的关键技术之一,它提供一种机制,当指定的对象的属性被修改后,则其观察者就会接受到通知,KVO其实也是“观察者”设计模式的一种应用。这种模式有利于两个类间的解耦合,尤其是对于 业务逻辑与视图控制 这两个功能的解耦合。
KVO 的底层实现:

KVO 是基于运行时实现的,当一个类的属性被观察的时候,系统会通过 runtime 动态的创建一个该类的派生类,并且会在这个类中重写基类被观察的属性的 setter 方法,而且系统将这个类的 isa 指针指向了派生类,从而实现了给监听的属性赋值的时候调用派生类的 setter 方法,重写 setter 方法的前后,通知对象值的改变.

results matching ""

    No results matching ""