KVC应用场景有哪些
- 动态地取值和设值
- 利用KVC来访问、修改对象和字典之间的转换
- model和字典之间转换
- 实现高阶消息传递
当对容器类(如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可以是任何类型的对象类型。










网友评论