博客
关于我
iOS KVC
阅读量:516 次
发布时间:2019-03-08

本文共 2708 字,大约阅读时间需要 9 分钟。

KVC(Key Value Coding)开发指南

KVC(Key Value Coding)是一种基于NSKeyValueCoding非正式协议的动态属性存取机制,允许通过键值对直接访问和修改对象属性,而无需明确定义存取方法。这种机制特别适用于动态处理对象属性。

一、KVC核心原理

KVC通过键(key)值(value)对应关系,对对象属性进行间接访问和修改。开发者可以利用点语法或KVC方法来实现属性操作,但两者可兼用,即KVC会首先查找点语法对应的方法。

KVC适用于以下场景:

  • 没有明确存取方法的类
  • 需要动态定制存取逻辑的场景
  • 需要利用KVC强大功能如批量操作和深层访问的场景

二、KVC通用操作

1. 存取方法

KVC提供了以下通用的存取方法:

Getter方法

- (nullable id)valueForKey:(NSString *)key;

Setter方法

- (void)setValue:(nullable id)value forKey:(NSString *)key;

2. 深层访问(KeyPath)

KVC支持通过点语法键路径(Key Path)进行深层访问,适用于嵌套对象和数组:

####Setter方法

- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;

####Getter方法

- (nullable id)valueForKeyPath:(NSString *)keyPath;

三、KVC多值操作

KVC支持批量操作,适用于日常开发中常见的设置和获取多个属性的需求。

1. 批量取值

- (NSDictionary
*)dictionaryWithValuesForKeys:(NSArray
)keys;

2. 批量赋值

- (void) setValuesForKeysWithDictionary:(NSDictionary
*)keyedValues;

3. 示例

// 结果会输出:{// 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;

Nil值处理

- (void) setNilValueForKey:(NSString *)key;

注意事项

  • JSON字典字段与模型类字段匹配,字段缺失不影响,但字段不一致会导致崩溃
  • 基本数据类型(如int)会自动转换为NSNumber,需注意NSString接收数据时可能需要转换
  • 集合类型不可为nil,否则会崩溃
  • 未定义的键值属性可转为NSNull类型

六、集合运算

KVC支持通过键路径执行集合运算,适用于NSArrayNSSet等集合对象:

集合操作符

// 计算属性总和NSNumber *sum = [array valueForKeyPath:@"@sum.streetNumber"];

数组操作符

// 将集合中的对象属性收集到数组中NSArray *cityList = [array valueForKeyPath:@"@unionOfObjects.city"];

嵌套操作符

// 收集嵌套数组中的数据NSArray *result = [array valueForKeyPath:@"@unionOfArrays.sub089"];

七、KVC搜索规则

KVC搜索规则决定了在查找键或键路径时如何循序渐进地寻找目标值。这一机制基于 následující逻辑:

  • 对象属性检查:首先检查对象属性是否允许直接访问实例变量(accessInstanceVariablesDirectly属性)
  • 方法搜索:按get.'<key'>is'<key>''_<key>'等顺序查找设定好的方法
  • 集合代理:若未找到指定方法,KVC会返回集合代理,继续处理集合相关操作
  • 异常处理:若搜索规则未找到对应选项,触发valueForUndefinedKey:方法并抛出异常
  • ###Setter搜索规则

  • 查找设定方法:首先查找set '<key'></>_set '<key>'</>方法
  • 实例变量:若未找到设定方法,检查对应的实例变量(_-key-_isKey等)
  • 异常处理:若仍未找到,将调用setValue:forUndefinedKey:方法并抛出异常
  • KVC的核心在于灵活的属性存取方案,适用于多种场景下的动态属性管理需求。通过合理配置setter和getter方法,可以实现对复杂对象的精准控制。

    转载地址:http://lcmnz.baihongyu.com/

    你可能感兴趣的文章
    玩玩小爬虫——试搭小架构
    查看>>
    Python大神编程常用4大工具,你用过几个?
    查看>>
    linux kernel version magic 不一致导致的模块 加载 (insmod) 不上
    查看>>
    centos7一步一步搭建docker jenkins 及自定义访问路径重点讲解
    查看>>
    MySQL 1064 You have an error in your SQL syntax 错误解决办法
    查看>>
    【Flink】Flink 底层RPC框架分析
    查看>>
    MySQL错误日志(Error Log)
    查看>>
    oracle使用DBMS_RANDOM包生成随机数据
    查看>>
    C++高精度模板
    查看>>
    解决:angularjs radio默认选中失效问题
    查看>>
    windows环境下安装zookeeper(仅本地使用)
    查看>>
    缓冲区溢出实例(一)--Windows
    查看>>
    Badboy录制脚本时,提示脚本错误的解决方法
    查看>>
    PHP一句话木马小总结与SQL语句写一句话木马
    查看>>
    关于计数排序
    查看>>
    Python中字符串前添加r ,b, u, f前缀的含义
    查看>>
    Hadoop学习笔记—Yarn
    查看>>
    JSONPath小试牛刀之Snack3
    查看>>
    Jenkins - 部署在Tomcat容器里的Jenkins,提示“反向代理设置有误”
    查看>>
    2017年前端框架、类库、工具大比拼
    查看>>