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 = 1;

  通过kvc设置班级号:

stu.stuClass = [ClassInfo new];
[stu setValue:@(1) 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=0; i<5; i++) {
Test *test = [[Test alloc] init];
[test setValue:@(100-10*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://blog.csdn.net/jerehedu/ 

本文版权归烟台杰瑞教育科技有限公司和CSDN共同拥有,欢迎转载。但未经作者允许必须保留此段声明。且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
 

IOS中Key-Value Coding (KVC)的使用具体解释的更多相关文章

  1. iOS key value coding kvc在接收json数据与 model封装中的使用

    iOS key value coding  kvc在接收json数据与 model封装中的使用 使用 kvc 能够极大的简化代码工作,及以后的接口维护工作: 1:先创建MovieModel类.h和 . ...

  2. ios中键值编码kvc和键值监听kvo的特性及详解

    总结: kvc键值编码  1.就是在oc中可以对属性进行动态读写(以往都是自己赋值属性)           2. 如果方法属性的关键字和需要数据中的关键字相同的话                  ...

  3. 【原】iOS中KVC和KVO的区别

    在iOS开发中经常会看到KVC和KVO这两个概念,比较可能混淆,特地区分一下 KVC(Key Value Coding) 1> 概述 KVC:Key Value Coding,键值编码,是一种间 ...

  4. iOS中关于KVC与KVO知识点

    iOS中关于KVC与KVO知识点 iOS中关于KVC与KVO知识点  一.简介 KVC/KVO是观察者模式的一种实现,在Cocoa中是以被万物之源NSObject类实现的NSKeyValueCodin ...

  5. iOS中的crash防护(二)KVC造成的crash

      接上篇< iOS中的crash防护(一)unrecognized selector sent to instance> 我们攻克了找不到方法实现的crash,这一篇我这里主要分析一下在 ...

  6. IOS 中微信 网页授权报 key[也就是code]失效 解决办法

    枪魂微信平台ios手机点击返回 网页授权失败,报key失效.已经解决,原因是授权key只能使用一次,再次使用就会失效. 解决办法:第一次从菜单中进行授权时,用session记录key和open_id. ...

  7. iOS开发系列--Objective-C之KVC、KVO

    概述 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听( ...

  8. iOS开发系列--Objective-C 之 KVC、KVO

    概述 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听( ...

  9. iOS开发系列-UI基础-KVC

    这些知识是UI初级学习的,目前我还在学习中,适合初学者看 KVC—Key Value Coding 也就是键值编码 是一种获取值和设置值的方式 当我们创建一个类文件,为这个类设置成员属性的时候: 创建 ...

随机推荐

  1. ssh环境搭建并实现登录功能

    参照了这篇博客,但是里面有些地方进行了更改 http://wenku.baidu.com/link?url=edeegTquV2eR3CJ5-zvNcJbyuq11Afp-lD2Fz2jfmuHhV1 ...

  2. HTML静态网页的格式与布局(position:(fixed、absolute、relative)、分层、float(left、right))

    一.position:fixed 锁定位置(相对于浏览器的位置),例如有些网站的右下角的弹出窗口. 示例: 二.position:absolute 1.外层没有position:absolute(或r ...

  3. BZOJ 1221: [HNOI2001] 软件开发(最小费用最大流)

    不知道为什么这么慢.... 费用流,拆点.... --------------------------------------------------------------------------- ...

  4. Java "JSON中无分隔符日期字符串处理"

    Json 中日期类型数据处理,服务端传输的日期没有分隔符,一般格式就两种,[20151212121212]即yyyyMMddhhmmss和[121212]hhmmss import java.text ...

  5. 0610 python 基础03

    复习: 条件判断 if..else >>> age=28 >>> if age<18: ...   print "你还没有成年吧" ... ...

  6. Optimistic and Pessimistic locking

    悲观锁 悲观锁是指假设并发更新冲突会发生,所以不管冲突是否真的发生,都会使用锁机制. 悲观锁会完成以下功能:锁住读取的记录,防止其它事务读取和更新这些记录.其它事务会一直阻塞,直到这个事务结束. 悲观 ...

  7. The introduction to Web.config of ASP.NET #Reprinted#

    花了点时间整理了一下ASP.NET Web.config配置文件的基本使用方法.很适合新手参看,由于Web.config在使用很灵活,可以自定义一些节点.所以这里只介绍一些比较常用的节点. <? ...

  8. 名叫Florida的女孩问题

    近读列纳德·蒙洛迪诺的<醉汉的脚步>,读到第六章,作者举了一个超级变态的例子来解释条件概率或者说是贝叶斯概率. 1.先来看一个简单点的问题:已知所有有2个孩子的家庭,其中一个家庭2个孩子都 ...

  9. 使用Docker构建持续集成与自动部署的Docker集群

    为什么使用Docker " 从我个人使用的角度讲的话  部署来的更方便 只要构建过一次环境 推送到镜像仓库 迁移起来也是分分钟的事情 虚拟化让集群的管理和控制部署都更方便 hub.docke ...

  10. 贫血模型or领域模型

    参考: http://lifethinker.iteye.com/blog/283668 http://www.uml.org.cn/mxdx/200907132.asp http://www.itu ...