前言
KVC全称KeyValueCoding,称作键值编码。
KVC的方法定义在Foundation框架下的NSKeyValueCoding.h文件下。Foundation为我们提供了NSObject、NSArray、NSDictionary、NSMutableDictionary、NSOrderedSet、NSSet关于KeyValueCoding的分类。也就是说,只有这几个类及其子类,才能使用KVC的方法。KVC的常用方法是根据key进行取值和设值操作,具体如下:
1. -(nullable id)valueForKey:(NSString *)key;
2. -(void)setValue:(nullable id)value forKey:(NSString *)key;
这两个方法根据上述类型不同,具体功能也不同,将分三个模块介绍:
一 NSObject
-(void)setValue:(nullable id)value forKey:(NSString *)key 流程具体如下图,死记硬背即可:
-(nullable id)valueForKey:(NSString *)key具体流程如下图,死记硬背:
二 NSDictionary、NSMutableDictionary
NSDictionary是不可变字典,初始化后value就不可以改变,所以NSDictionary只有valueForKey:,没有setValue:ForKey:。而NSMutableDictionary同时拥有setValue:ForKey:和valueForKey:。
而setValue:ForKey:的实现是调用NSMutableDictionary的-setObject:forKey: ,如果value是nil,那么调用-removeObjectForKey:,valueForKey:是调用NSDictionary、NSMutableDictionary的-objectForKey: 。
三 NSArray、NSOrderedSet、NSSet
1)这三个类调用-setValue:forKey:时,数组或集合中的每个元素都会调用-setValue:forKey:
2)这三个类调用-valueForKey:时,数组或集合中的每个元素都会调用-valueForKey:,但是返回值略有不同:
1. NSArray:每个元素都调用-valueForKey:,返回值为NSArray。如果某个元素调用-valueForKey:返回nil,则数组中对应的元素为NSNull;
2. NSSet:每个元素都调用-valueForKey:,返回值为NSSet。在返回的NSSet中,nil值会被忽略,且相同的元素只出现一次。
3. NSOrderSet:每个元素都调用-valueForKey:,返回值为NSOrderSet。在返回的NSSet中,nil值会被忽略,且相同的元素只出现一次。