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的更多相关文章

  1. Automake

    Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...

  2. 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态

    一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...

  3. iOS - 详细理解KVC与KVO

    详细理解KVC与KVO 在面试的时候,KVC与KVO有些时候还是会问到的,并且他们都是Objective C的关键概念,在这里我们先做一个简单地介绍: (一)KVC: KVC即指:NSKeyValue ...

  4. KVC 与 KVO 理解

    KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一 ...

  5. KVC浅析和实例

    KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一 ...

  6. KVC 与 KVO 理解-b

    KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一 ...

  7. KVC与KVO的理解

    KVC与KVO是Objective C的关键概念. Key—Value Coding (KVC) 即是指NSKeyValueCoding,一个非正式的Protocol,提供一种机制间接访问对象的属性. ...

  8. [转] iOS (OC) 中 KVC 与 KVO 理解

    转自: http://magicalboy.com/kvc_and_kvo/ KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value ...

  9. KVC与KVO理解

    转载:https://magicalboy.com/kvc_and_kvo/ KVC 与 KVO 理解 KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲 ...

随机推荐

  1. [ Android 五种数据存储方式之三 ] —— SQLite存储数据

    SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PHP, Python)都使用了 ...

  2. C# 程序只能执行一次

    应用程序的主入口点. //每一个程序只能运行一个实例 bool isRun = false; System.Threading.Mutex m = new System.Threading.Mutex ...

  3. ajax数据交互(arcgis server)

    通过ajax来调用服务器map数据,来实现搜索功能. 效果: 1.我要搜索下中国移动的地理信息: 2.会搜出17条消息,然后把他们分页显示,一页6条: 3.每一页的6天数据,会在map生成一个6条ma ...

  4. EFCore扩展:IQueryable(linq)或sql执行的查询缓存与清理

    前言 上一篇讲述了执行sql和配置的一些功能,这篇说明IQueryable(linq)或执行sql的查询缓存与清理,包括扩展到将缓存存储到Redis中. 扩展类库源码: github:https:// ...

  5. POJ2187(旋转卡壳)

    Beauty Contest Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 35459   Accepted: 10978 ...

  6. 关于WIN10开机无法输入密码的问题

    昨日,电脑 遇到了开机无法输入密码的问题,神烦. 作为一个计算狗,怎么能直接装系统(百度了一堆方法,装系统,果真万能)呢. 所以,深刻的分析了下. 1 .首先说明基本情况. 计算机品牌:ASUS 系统 ...

  7. [No0000B7]If else 与 三元表达式? : 效率对比

    先看 if else 一段代码 using System; class Program { private static void Main() { ; ) i = -; ; Console.Writ ...

  8. css3弹性盒子模型——回顾。

    1.box-flex属性规定框的子元素是否可伸缩其尺寸. 父元素必须要声明display:box;子元素才可以用box-flex. 语法:box-flex:value; 示例: <style&g ...

  9. EF6多线程与分库架构设计之Repository

    1.项目背景 这里简单介绍一下项目需求背景,之前公司的项目基于EF++Repository+UnitOfWork的框架设计的,其中涉及到的技术有RabbitMq消息队列,Autofac依赖注入等常用的 ...

  10. 【踩坑速记】MIUI系统BUG,调用系统相机拍照可能会带给你的一系列坑,将拍照适配方案进行到底!

    一.写在前面 前几天也是分享了一些学习必备干货(还没关注的,赶紧入坑:传送门),也好久没有与大家探讨技术方案了,心里也是挺痒痒的,这不,一有点闲暇之时,就迫不及待把最近测出来的坑分享给大家. 提起An ...