Key-value-code 键值编码 是一个基于NSKeyValueCoding非正式协议实现的机制,它可以直接通过key值对对象的属性进行存取操作,不需要通过调用明确的存取方法,这样就是在运行时动态在访问和修改对象的的属性,如果爱实现了访问器方法的类中点语法和KVC访问对象差别不大,反之,怎KVC 就有优势了。KVC 本质上是操作方法列表以及在内存中查找实例变量。
通过关键字Key来设值和取值,如果没有找到Set<Key>方法,会按照_key,_isKey,key,isKey的顺序搜索成员并进行赋值操作。
写代码验证
TestKvcObj *obj = [[TestKvcObj alloc] init];
[obj setValue:@"xiaomao" forKey:@"name"];
NSLog(@"obj的名字是%@",[obj valueForKey:@"name"]);
设置可以访问Set集合
@interface TestKvcObj ()
{
NSString *_isName;
}
@end
@implementation TestKvcObj
+ (BOOL)accessInstanceVariablesDirectly{
return YES;
}
- (id)valueForUndefinedKey:(NSString *)key{
NSLog(@"%s出现异常。该key不存在%@",__func__,key);
return nil;
}
- (void)setValue:(id)value forUndefinedKey:(NSString *)key{
NSLog(@"%s出现异常。该key不存在%@",__func__,key);
}
2020-11-02 17:35:38.165038+0800 LearnKVC[8200:772417] obj的名字是xiaomao
设置不直接访问Set集合
@interface TestKvcObj ()
{
NSString *_isName;
}
@end
@implementation TestKvcObj
+ (BOOL)accessInstanceVariablesDirectly{
return NO;
}
- (id)valueForUndefinedKey:(NSString *)key{
NSLog(@"%s出现异常。该key不存在%@",__func__,key);
return nil;
}
- (void)setValue:(id)value forUndefinedKey:(NSString *)key{
NSLog(@"%s出现异常。该key不存在%@",__func__,key);
}
2020-11-02 17:37:17.133987+0800 LearnKVC[8217:773965] -[TestKvcObj setValue:forUndefinedKey:]出现异常。该key不存在name
2020-11-02 17:37:17.134273+0800 LearnKVC[8217:773965] -[TestKvcObj valueForUndefinedKey:]出现异常。该key不存在name
2020-11-02 17:37:17.134385+0800 LearnKVC[8217:773965] obj的名字是(null)
KVC 的使用
1.动态取值和设值
例如批量取值操作
- (NSDictionary<NSString *, id> *)dictionaryWithValuesForKeys:(NSArray<NSString *> *)keys;
批量赋值操作
- (void)setValuesForKeysWithDictionary:(NSDictionary<NSString *, id> *)keyedValues;
2.访问和修改私有变量
valueForKey:
setValue forKey:
3.Mode和字典的转换
使用 KVC 进行字典转模型
setValuesForKeysWithDictionary
4.操作集合 valueForKey
5.实现高阶消息传递
NSArray* arrStr = @[@"english",@"franch",@"chinese"];
NSArray* arrCapStr = [arrStr valueForKey:@"capitalizedString"];
for (NSString* str in arrCapStr) {
NSLog(@"%@",str);
}
2020-11-02 17:56:28.307124+0800 LearnKVC[8302:785679] English
2020-11-02 17:56:28.307314+0800 LearnKVC[8302:785679] Franch
2020-11-02 17:56:28.307449+0800 LearnKVC[8302:785679] Chinese
参考资料