IOS中Key-Value Coding (KVC)的使用详解
kvc,键值编码,是一个非正式的协议,它提供一种机制来间接访问对象的属性。直接访问对象是通过调用访问器的方法实现,而kvc不需要调用访问器的设置和获取方法,可以直接访问对象的属性。
下面介绍一下kvc的用法:
1、对属性赋值
kvc是通过键值对的方式对属性设置值,提供了下面的方法,相当于访问器中的set方法。value为要设置的值,key是字符串,字符串中内容为为属性的名称
- (void)setValue:(id)value forKey:(NSString *)key;
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
下面通过一个小例子讲解一下通过访问器和kvc对属性赋值的代码实现。
假设Student类中有一个name属性,直接对name赋值的方式为:
Student *stu = [[Student alloc] init];
stu.name = @"jerehedu";
通过kvo对name进行赋值:
Student *stu = [[Student alloc] init];
[stu setValue:@"jerehedu" forKey:@"name"];
假设学生类中还有一个属性为ClassInfo班级类的对象stuClass,在ClassInfo班级类中有个classNo班级号的属性,下面通过直接的方式设置班级号:
stu.stuClass = [ClassInfo new];
stu.stuClass.classNo = ;
通过kvc设置班级号:
stu.stuClass = [ClassInfo new];
[stu setValue:@() forKeyPath:@"stuClass.classNo"];
通过keyPath设置时,路径由 xx.xx 表示;
value的值为OC对象,如果为基本数据类型,需要进行装箱,也就是包装为OC对象;
2、获取属性的值
kvc提供了获取对象属性值的方法,相当于访问器的get方法,取值的时候也是通过键值对方式。
- (id)valueForKey:(NSString *)key;
- (id)valueForKeyPath:(NSString *)keyPath;
下面通过一个小例子讲解一下通过访问器和kvc对属性取值的代码实现。
假设要获取Student类中name的值,直接对name取值的方式为:
NSString *name = stu.name;
通过kvc取值的方式为:
NSString *name = [stu valueForKey:@"name"];
通过访问器方法直接从Student类中取班级号:
int num = stu.stuClass.classNo;
通过kvc取Student类中中班级号:
int num = [[stu valueForKeyPath:@"stuClass.classNo"] intValue];
默认取到的值为OC对象,如果想得到基本数据类型,需要进行拆箱操作。
3、key找不到时,处理异常
使用kvc时,如果代码中的key值不存在,会抛出异常,可以在类中通过重写它提供下面的这个方法来解决这个问题。
- (void)setValue:(id)value forUndefinedKey:(NSString *)key;
当key不存在时,会自动调用上面的这个方法,可以在这个方法中进行处理。
4、kvc的用法补充
kvc非常好用,可以简化我们的代码,除了可以不用通过访问器方法,直接对属性进行访问外,还可以对对象中的属性进行运算。
比如新添加一个Test测试类,里面有一个score分数的属性,在Student类中有一个数组,数组中存放考试信息(Test类对象),通过kvo可以直接得到数组中存储的所有考试的平均成绩、最好成绩等。
通过kvo存储考试数组信息:
NSMutableArray *ary = [NSMutableArray array];
for (int i=; i<; i++) {
Test *test = [[Test alloc] init];
[test setValue:@(-*i) forKey:@"score"];
[ary addObject:test];
}
stu.testAry = ary;
在Student类中将考试信息打印输出:
NSLog(@"show: testAry = %@ ",[self valueForKey:@"testAry"]); NSLog(@"show: testAry.score = %@",[self.testAry valueForKey:@"score"] ); NSLog(@"show: testAry.score = %@",[self.testAry valueForKeyPath:@"score"] ); NSLog(@"show: 数组中总成绩SUMscore = %@",[self.testAry valueForKeyPath:@"@sum.score"] );
NSLog(@"show2: 数组中平均成绩AVGscore = %@",[self.testAry valueForKeyPath:@"@avg.score"] );
NSLog(@"show2: 数组中最大成绩MAXscore = %@",[self.testAry valueForKeyPath:@"@max.score"] );
NSLog(@"show2: 数组中最小成绩MINscore = %@",[self.testAry valueForKeyPath:@"@min.score"] );
疑问咨询或技术交流,请加入官方QQ群: (452379712)
出处:http://www.cnblogs.com/jerehedu/
本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
IOS中Key-Value Coding (KVC)的使用详解的更多相关文章
- iOS中touches事件,addtarget ...action和GestureRecognizer详解
刚学完uiview,uicontrol类,许多人知道 touchesBegain,touchesMoved,touchesEnd,GestureRecognizer的用途,但仔细考虑这些事件之间的关系 ...
- iOS key value coding kvc在接收json数据与 model封装中的使用
iOS key value coding kvc在接收json数据与 model封装中的使用 使用 kvc 能够极大的简化代码工作,及以后的接口维护工作: 1:先创建MovieModel类.h和 . ...
- 李洪强iOS经典面试题155 - const,static,extern详解(面试必备)
李洪强iOS经典面试题155 - const,static,extern详解(面试必备) 一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽 ...
- appledoc导出iOS代码文档的使用和问题详解(干货篇)
appledoc导出iOS代码文档的使用和问题详解(干货篇) 1. 简单说一下背景和自己感受 背景: 项目好像突然黄了,公司让详细写项目代码的注释并且导出文档,弄完之后就要封版. 说实话:听到这个消息 ...
- JSON取值(key是中文或者数字)方式详解
JSON取值(key是中文或者数字)方式详解 先准备一个json对象用于演示 var json = {'name':'zhangsan', '年龄':23, 404:'你可能迷路了'}; 使用JS中w ...
- CSS中伪类及伪元素用法详解
CSS中伪类及伪元素用法详解 伪类的分类及作用: 注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的 ...
- SVN组成中trunk,branches and tags功能用法详解
SVN组成中trunk,branches and tags功能用法详解 我相信初学开发在SVN作为版本管理时,都估计没可能考虑到如何灵活的运用SVN来管理开发代码的版本,下面我就摘录一篇文章来简单说 ...
- UIViewController中各方法调用顺序及功能详解
UIViewController中各方法调用顺序及功能详解 UIViewController中loadView, viewDidLoad, viewWillUnload, viewDidUnload, ...
- 单元测试系列之四:Sonar平台中项目主要指标以及代码坏味道详解
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6766994.html 众所周知Sona ...
随机推荐
- 批量ping工具fping
批量ping工具fping ping是各个系统自带的基于ICMP协议的主机探测工具.但该工具一次只能检测一个主机,不满足渗透测试批量探测的需要.Kali Linux提供一款批量探测工具fping. ...
- Linux网卡驱动
<网络知识> a:网络模型 OSI模型 TCP模型 虽然OSI模型看着挺完美的,但是过于复杂,这样就会导致不实用,在Linux系统中 ...
- Redis 连接命令
1.AUTH password 验证密码是否正确 2.ECHO message 打印字符串 3.PING 查看服务是否运行 4.QUIT 关闭当前连接 5.SELECT index 切换到指定的数据库
- [HNOI2008]玩具装箱
OJ题号: BZOJ1010 思路: 斜率优化动态规划. 由题意得状态转移方程为$f_i=\displaystyle{\min_{j=0}^{i-1}}\{f_j+\left(i-j-1+\displ ...
- vijos p1881 线段树
题意:点我 我就想问,现在换代码风格还来得及吗? 2015-05-19:线段树进一步加强,看来不用换风格了 维护左右节点左右端颜色和长度即可 #include<cstdio> #inclu ...
- Vue 生命周期方法
一.Vue 生命周期 Vue的生命周期即是实例从创建到销毁的一个过程.之前在学习Vue的时候,看过官网的教程,但是经常用到的是mounted,所以对其他生命周期方法不是很熟悉,这里有空做个总结,也方便 ...
- 在Hexo中渲染MathJax数学公式
最近学机器学习涉及很多的数学公式,公式如果用截图显示,会比较low而且不方便.因此需要对Hexo做些配置,支持公式渲染.同时文末整理了各种公式的书写心得,比如矩阵.大小括号.手动编号.上下角标和多行对 ...
- centos7安装kafka_2.11-1.0.0 新手入门
系统环境 1.操作系统:64位CentOS Linux release 7.2.1511 (Core) 2.jdk版本:1.8.0_121 3.zookeeper版本:zookeeper-3.4.9. ...
- DOM-XML(解析与创建)
/** * 读取(解析)xml文件 * @author Administrator * */ public class DOMRead { public static void main(String ...
- Hibernate3 jar包的作用[转]
from:http://nopainnogain.iteye.com/blog/761630 (1)hibernate3.jar: Hibernate的核心库,没有什么可说的,必须使用的jar包 (2 ...