IOS. KVC 知识梳理

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

参考资料

https://juejin.im/post/6844903602545229831

https://www.jianshu.com/p/f6c41ffb88df

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值