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 = 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共同拥有,欢迎转载。但未经作者允许必须保留此段声明。且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

时间: 2024-10-10 06:10:49

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

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

总结: kvc键值编码  1.就是在oc中可以对属性进行动态读写(以往都是自己赋值属性)           2. 如果方法属性的关键字和需要数据中的关键字相同的话                  3. 动态设置:setValue:属性值 forKey:属性名(用于简单的路径)/setValue:属性值 forKeyPath:属性名(用于复杂的路径)kvo键值监听  永久性的监听item属性值的改变,如果改变就从新设置             1.监听方法:[addObserver:self

iOS中的copy ,kvc,kvo

拷贝 实现拷贝的方法有2个 copy:返回不可变副本 只有NSString到NSString得拷贝是浅拷贝,其他的都是深拷贝.深拷贝拷贝对象,浅拷贝拷贝指针. mutableCopy:返回可变副本 普通对象实现拷贝的步骤 遵守NSCopying协议 #import <Foundation/Foundation.h> @interface MRCar : NSObject <NSCopying> /** 价钱 */ @property (nonatomic, assign) doub

iOS 中 NSParameterAssert 是干啥的之官方解释翻译篇

断言评估一个条件,如果条件为 false ,调用当前线程的断点句柄.每一个线程有它自已的断点句柄,它是一个 NSAsserttionHandler 类的对象.当被调用时,断言句柄打印一个错误信息,该条信息中包含了方法名.类名或函数名.然后,它就抛出一个 NSInternalInconsistencyException 异常.Assertions evaluate a condition and, if the condition evaluates to false, call the asse

【原】iOS中KVC和KVO的区别

在iOS开发中经常会看到KVC和KVO这两个概念,比较可能混淆,特地区分一下 KVC(Key Value Coding) 1> 概述 KVC:Key Value Coding,键值编码,是一种间接访问实例变量的方法. KVC 提供了一个使用字符串(Key)而不是访问器方法,去访问一个对象实例变量的机制. 2> KVC部分源码(头文件) 1 // NSKeyValueCoding.h 2 @interface NSObject(NSKeyValueCoding) 3 4 + (BOOL)acce

iOS 中KVC、KVO、NSNotification、delegate 总结及区别

iOS 中KVC.KVO.NSNotification.delegate 总结及区别 1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性.而不是通过调用Setter.Getter方法访问.KVO 就是基于 KVC 实现的关键技术之一. Demo: @interface myPerson : NSObject { NSString*_name; int      _age; int      _height; int      _w

IOS中关于KVC与KVO知识点

一.简介 KVC/KVO是观察者模式的一种实现,在Cocoa中是以被万物之源NSObject类实现的NSKeyValueCoding/NSKeyValueObserving非正式协议的形式被定义为基础框架的一部分.从协议的角度来说,KVC/KVO本质上是定义了一套让我们去遵守和实现的方法.当然,KVC/KVO实现的根本是Objective-C的动态性和runtime,这在后文的原理部分会有详述.另外,KVC/KVO机制离不开访问器方法的实现. 1.KVC简介 全称是Key-value codin

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

枪魂微信平台ios手机点击返回 网页授权失败,报key失效.已经解决,原因是授权key只能使用一次,再次使用就会失效. 解决办法:第一次从菜单中进行授权时,用session记录key和open_id.当点击返回时,判断session中key是否为空当不为空时,直接获取open_id,就不用通过key进行验证并获取open_id . $open_id = ""; if(!empty($_GET["code"])&&empty($_SESSION[&qu

天气预报接口IOS版OC:SmartWeather API中key的计算方法

最近在做一个天气预报app,看见国家气象局有api接口提供,但是需要申请,网址 http://smart.weather.com.cn/wzfw/smart/weatherapi.shtml, 审核大概需要一周左右,审核通过后,你会收到一封邮件 您好: 欢迎使用SmartWeatherAPI测试接口 恭喜您的申请已通过审核,以下是为您分配的鉴权信息: appid:XXXXXXXXXXXXXXXX private_key:XXXXXXXXXXXXXXXX 接口使用说明请参考<SmartWeathe

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

概述 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听(KVO)特性: 键值编码KVC 键值监听KVO 键值编码KVC 我们知道在C#中可以通过反射读写一个对象的属性,有时候这种方式特别方便,因为你可以利用字符串的方式去动态控制一个对象.其实由于ObjC的语言特性,你根部不必进行任何操作就可以进行属性的动态读写,这种方式就是Key Value Codin