本文共 2708 字,大约阅读时间需要 9 分钟。
KVC(Key Value Coding)是一种基于NSKeyValueCoding
非正式协议的动态属性存取机制,允许通过键值对直接访问和修改对象属性,而无需明确定义存取方法。这种机制特别适用于动态处理对象属性。
KVC通过键(key)值(value)对应关系,对对象属性进行间接访问和修改。开发者可以利用点语法或KVC方法来实现属性操作,但两者可兼用,即KVC会首先查找点语法对应的方法。
KVC适用于以下场景:
KVC提供了以下通用的存取方法:
- (nullable id)valueForKey:(NSString *)key;
- (void)setValue:(nullable id)value forKey:(NSString *)key;
KVC支持通过点语法键路径(Key Path)进行深层访问,适用于嵌套对象和数组:
####Setter方法
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
####Getter方法
- (nullable id)valueForKeyPath:(NSString *)keyPath;
KVC支持批量操作,适用于日常开发中常见的设置和获取多个属性的需求。
- (NSDictionary*)dictionaryWithValuesForKeys:(NSArray )keys;
- (void) setValuesForKeysWithDictionary:(NSDictionary*)keyedValues;
// 结果会输出:{// name = buer;// age = 11;// sex = 0;// }Person *person01 = [[Person alloc] init];[person01 setValue:@"buer" forKey:@"name"];[person01 setValue:@11 forKey:@"age"];[person01 setValue:@(0) forKey:@"sex"];NSDictionary *dic01 = [person01 dictionaryWithValuesForKeys:@["name", @"age", @"sex"]];NSDictionary *dic02 = @{ @"name": @12, @"age": @11, @"sex": @"1"};Person *person02 = [[Person alloc] init];[person02 setValuesForKeysWithDictionary:dic02];// 输出结果:// name = 12, age = 11, sex = 1
KVC支持通过设置器将JSON字典直接映射到模型对象。若键值与模型属性不一致,可通过setValue:forUndefinedKey:
方法 customize处理。
- (void) setValue:(nullable id) value forUndefinedKey:(NSString *)key;
KVC在搜索规则无法找到对应键或键路径时,会触发异常方法。开发者可根据需求重写以下方法:
- (nullable id) valueForUndefinedKey:(NSString *)key;
- (void) setValue:(nullable id) value forUndefinedKey:(NSString *)key;
- (void) setNilValueForKey:(NSString *)key;
int
)会自动转换为NSNumber
,需注意NSString
接收数据时可能需要转换nil
,否则会崩溃NSNull
类型KVC支持通过键路径执行集合运算,适用于NSArray
和NSSet
等集合对象:
// 计算属性总和NSNumber *sum = [array valueForKeyPath:@"@sum.streetNumber"];
// 将集合中的对象属性收集到数组中NSArray *cityList = [array valueForKeyPath:@"@unionOfObjects.city"];
// 收集嵌套数组中的数据NSArray *result = [array valueForKeyPath:@"@unionOfArrays.sub089"];
KVC搜索规则决定了在查找键或键路径时如何循序渐进地寻找目标值。这一机制基于 následující逻辑:
accessInstanceVariablesDirectly
属性)get.'<key'>
、is'<key>'
、'_<key>'
等顺序查找设定好的方法valueForUndefinedKey:
方法并抛出异常###Setter搜索规则
set '<key'></>
或_set '<key>'</>
方法_-key-
,_isKey
等)setValue:forUndefinedKey:
方法并抛出异常KVC的核心在于灵活的属性存取方案,适用于多种场景下的动态属性管理需求。通过合理配置setter和getter方法,可以实现对复杂对象的精准控制。
转载地址:http://lcmnz.baihongyu.com/