KVC

作者: 一个栗 | 来源:发表于2020-12-30 20:42 被阅读0次

KVC应用场景有哪些

  1. 动态地取值和设值
  2. 利用KVC来访问、修改对象和字典之间的转换
  3. model和字典之间转换
  4. 实现高阶消息传递
    当对容器类(如NSArray)使用KVC时,valueForKey会被传递给容器中的每一个对象,而不是对容器本身进行操作,相应的结果会保存到返回的容器中,这也可以很方便地操作集合来返回另一个集合。示例代码如下:
NSArray *array = @[@"jack",@"join",@"tom"];
NSArray *result = [array valueForKey:@"capitalizedString"];
[result enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"idx = %lu obj = %@",(unsigned long)idx,obj);
    }];

结果如下:

2020-12-31 20:08:13.247777+0800 test[9277:20927141] idx = 0 obj = Jack
2020-12-31 20:08:13.247948+0800 test[9277:20927141] idx = 1 obj = Join
2020-12-31 20:08:13.248076+0800 test[9277:20927141] idx = 2 obj = Tom

方法capitalizedString被传递给array中的每一项,每个成员都会执行,字符串第一个字母变成了大写。
需要注意的是,如果要执行多个方法,可以执行valueForKeyPath。

NSMutableDictionary的setValue和setObject有什么区别?

setValue: forKey:方法的API是

@interface NSMutableDictionary<KeyType, ObjectType>(NSKeyValueCoding)

/* Send -setObject:forKey: to the receiver, unless the value is nil, in which case send -removeObjectForKey:.
*/
- (void)setValue:(nullable ObjectType)value forKey:(NSString *)key;

@end

官方解释:当发送setValue: forKey:消息给NSMutableDictionary对象,一般情况下仍是调用了setObject: forKey:方法,除非参数value为nil时,会转而调用removeObjectForKey:清除这个键值对。
对应setObject: forKey:方法的API是:

- (void)setObject:(ObjectType)anObject forKey:(KeyType <NSCopying>)aKey;

需要注意的是,这里的aKey是一个遵守了NSCopying协议的id对象,并不是NSString类型字符串只不过实际中常使用NSString,示例代码:

NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setObject:@"1" forKey:[NSNumber numberWithInt:1]];
[dic setValue:@"2" forKey:[NSNumber numberWithInt:2]];
NSLog(@"value1 = %@ value2 = %@",dic[[NSNumber numberWithInt:1]],dic[[NSNumber numberWithInt:2]]);

结果如下:

2020-12-31 20:29:03.680761+0800 test[9351:20938483] value1 = 1 value2 = 2

setValue: forKey:的key是非字符串类型时,系统会警告,但是不会报错,可以正常运行。

综上所述,主要区别有:
1.setObject: forKey:方法是NSMutableDictionary特有的,只有NSMutableDictionary类及其子类的实例话对象能使用,而setValue: forKey:是KVC的主要方法,只要遵循了NSCopying协议的对象都能够使用。
2.setObject: forKey:参数value的值不能为nil,否则抛出异常,而setValue: forKey:中的value可以为nil,当value为nil时,会自动调用removeObjectForKey方法。
3.setValue: forKey:中的key只能是NSString类型,而setObject: forKey:key可以是任何类型的对象类型。

相关文章

  • KVC详解

    KVC 目录结构KVC定义KVC取值和设置KVC使用keyPathKVC处理字典KVC作用 参考:iOS KVC和...

  • iOS原理篇(二): KVC实现原理

    KVC实现原理 什么是 KVC KVC基本使用 KVC 原理 总结 一 、 什么是KVC KVC的全称是Key-V...

  • iOS 关于KVC的一些总结

    本文参考: KVC官方文档 KVC原理剖析 iOS KVC详解 KVC 简介 KVC全称是Key Value Co...

  • KVC,KVO

    KVC , KVO KVC和KVO的区别及应用 KVC/KVO原理 1. KVC键值编码 KVC,即是指NSKey...

  • iOS 关于KVC的一些总结(转)

    原文:iOS 关于KVC的一些总结 本文参考: KVC官方文档 KVC原理剖析 iOS KVC详解 KVC 简介 ...

  • OC语法:KVC的底层实现

    一、KVC是什么二、怎么使用KVC三、KVC的底层实现四、KVC常见面试题 一、KVC是什么 KVC全称Key-V...

  • 19.iOS底层学习之iOS底层学习之KVC

    本篇提纲1、KVC的基本介绍2、KVC的API3、KVC的写入过程4、KVC的读取过程5、自定义KVC KVC的基...

  • iOS【KVC&KVO】

    kvc 1. KVC 1.1 KVC概念 KVC全称是Key Value Coding,定义在NSKeyValue...

  • ios开发UI篇—Kvc简单介绍

    一、KVC简单介绍 KVC key valued coding 键值编码 KVC通过键值间接编码 补充: 与KVC...

  • KVC的简单使用

    KVC字典转模型 KVC 中经常使用的就是字典转模型 KVC的大招 KVC设置对象属性及取值 KVC间接设置对象属...

网友评论

      本文标题:KVC

      本文链接:https://www.haomeiwen.com/subject/apsqoktx.html