Objective-C日记-之KVC
KVC(Key-Value-Coding?)
1, 概述
以字符串形式向对象的实例变量或属性(Property)发送或者获得值的方法。
2,用法
a,取值
@property (readwrite,copy)NSString * name; //car.h
@synthesize name;//car.m
现在,我想获得name的值,则可使用KVC方法
NSString *name=[car valueForKey:@"name"];
b,设置值
[car setValue:@"Harlod" forKey:@"name"];
3,延伸用法
a,使用路径(字符串表达形式加点表达形式)-(void)setValue:forKeyPath
@interface Engine:NSObject <NSCopying>{
int horsepower;
}
@end//Engine
[car setValue:[NSNumber numberWithInt:155]
forKeyPath:@"engine.horsepower"];
b,对NSArray使用键值,会对数组中每一个对象来查找这个键值,并将查询结果打包返回。
如下:
NSArray *pressures=[car valueForKeyPath:@"tires.pressure"];
NSLog(@"pressures %@",pressures);
会输出如下结果:
pressures(
34,
34,
34,
34
)
4,递进用法
a,快速运算,即使用转义运算符如@count,@max,@min,@avg计算键路径左侧的结果。
如下:
@interface Garge:NSObject{
NSString *name;
NSMutableArray *cars;
}
@property (readwrite,copy) NSString *name;
-(void) addCar:(Car *)car;
-(void)print;
@end//Garage
NSNumber *count;
count=[garage valueForKeyPath:@"cars.@count"];
NSLog(@"We have %@ cars",count);
NSNumber *sum;
sum=[garage valueForKeyPath:@"cars.@sum.mileage"];
NSLog(@"We have a grand total of %@ miles",sum);
b,快速获取或设置(使用字典)
-dictionaryWithValuesForKeys和-setValueForKeysWithDictionary
如下(获取值):
car=[[garage valueForKeyPath:@"cars"] lastObject];//键值路径中的cars并不是Garage中的属性,但也可以作为属性路径
首先,从garage中挑选一辆车car,如上
NSArray *keys=[NSArray arrayWithObjects:@"make",@"model",@"modelYear",nil];
而后,将需要获取的属性单列出来,放入keys数组中,如上
NSDictionary *carValues=[car dictionaryWithValuesForKeys:keys];
最后,使用字典型对像存储使用-dictionaryWithValuesForKeys获取的字典值。
以下为(设置值):
NSDictionary *newValues=[NSDictionary dictionaryWithObjectsAndKeys:@"Chevy",@"make",@"Nova",@"model",[NSNumber numberWithInt:1964],@"modelYear",nil];
首先,定义一个字典
[car setValuesForKeysWithDictionary:newValues];
再次,设置car的值。
c,处理未定义的键
当我们使用valueForKey时,使用的是一个未定义的关键字,则在运行时会报错:
this class is not key value coding-compliant for the key xxxxxx.
我们在处理这类问题时,一般会采用改写-valueForUndefinedKey和-setValue:forUndefinedKey方法
在Objective-C基础教程上采用的是如下方法
c1,定义一个空的字典对象stuff.
@interface Garage:NSObject{
NSString *name;
NSMutableArray *cars;
NSMutableDictionary *stuff;
}
c2,处理,设置未定义键的赋值问题,将键值对放入字典对象中
-(void)setValue:(id)value forUnderfinedKey:(NSString *)key{
if(stuff=nill){
stuff==[[NSMutableDictionary alloc]init];
}
[stuff setValeu:value forKey:key];
}//setValueForUndefinedKey
c3,处理,获取未定义键的值,将查找重定向至字典对象
-(id)valueForUndefinedKey:(NSString *)key{
id value=[stuff valueForKey:key];
return (value);
}//valueForUndefinedKey
Objective-C日记-之KVC的更多相关文章
- Automake
Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...
- 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态
一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...
- iOS - 详细理解KVC与KVO
详细理解KVC与KVO 在面试的时候,KVC与KVO有些时候还是会问到的,并且他们都是Objective C的关键概念,在这里我们先做一个简单地介绍: (一)KVC: KVC即指:NSKeyValue ...
- KVC 与 KVO 理解
KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一 ...
- KVC浅析和实例
KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一 ...
- KVC 与 KVO 理解-b
KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一 ...
- KVC与KVO的理解
KVC与KVO是Objective C的关键概念. Key—Value Coding (KVC) 即是指NSKeyValueCoding,一个非正式的Protocol,提供一种机制间接访问对象的属性. ...
- [转] iOS (OC) 中 KVC 与 KVO 理解
转自: http://magicalboy.com/kvc_and_kvo/ KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value ...
- KVC与KVO理解
转载:https://magicalboy.com/kvc_and_kvo/ KVC 与 KVO 理解 KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲 ...
随机推荐
- 强行在MFC窗体中渲染Cocos2d-x 3.6
[前言] 把Cocos2dx渲染到另一个应用程序框架中的方法,在2.x时代有很多大神已经实现了,而3.x的做法网上几乎找不着.这两天抽空强行折腾了一下,不敢独享,贴出来供大家参考. [已知存在的问题] ...
- JSP 禁用脚本设置
JSP 禁用脚本设置: web.xml: <?xml version="1.0" encoding="UTF-8"?> <web-app xm ...
- cookie、session、sessionid的区别
我们都知道银行,银行的收柜台每天要接待客户存款/取款业务,可以有几种方案: 1.凭借柜台职员的记忆,由收柜台职员来为每位顾客办理存款/取款业务,单凭职员的记忆力,要记到每位顾客的相貌,并迅速这个顾客当 ...
- SpringMvc项目中使用GoogleKaptcha 生成验证码
前言:google captcha 是google生成验证码的一个工具类,其原理是将随机生成字符串保存到session中,同时以图片的形式返回给页面,之后前台页面提交到后台进行对比. 1.jar包准备 ...
- web前端性能调优(二)
项目经过第一波优化之后APP端已基本已经符合我们的要求了,但是TV端还是反应比较慢,页面加载和渲染都比较慢了一点,我觉的还是有必要在进行一些优化,经过前面的优化,我们的优化空间已经小了一部分,不过还是 ...
- pytho查找斐波那契序列中的值
''' 实现斐波那契序列,查找其中第N个数的值 ''' def FeiBSequence(list,N): length=len(list); i=0; while i<length: if N ...
- HDU1392(凸包)
Surround the Trees Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- android 获取适配的bitmap等相关
获取适配尺寸的图片: File files = new File(imagePath); FileInputStream is = null; BufferedInputStream bis = nu ...
- J.U.C并发框架
转载:http://itindex.net/detail/48869-j.u.c-%E6%A1%86%E6%9E%B6 J.U.C并发框架 作者:Doug Lea SUNY Oswego Oswego ...
- 支撑Pinterest日均1000+次试验的A/B测试平台揭秘
编者按:本文详细介绍了 Pinterest 内部A/B测试平台的搭建过程,对于无论是有技术能力和资源想要自建A/B测试系统的大公司,还是想在业务中引入第三方A/B测试方法和工具的中小公司都极具参考意义 ...