示例1:基本赋值取值

@interface Book : NSObject { 
    NString *name;
}
@end

#import "Book.h"
@implementation Book
@end

这个Book类太简单了,只有一个实例变量name。而且,按照以前掌握的技术,没有办法给这个变量赋值了。下面KVC登场:

Book *book=[[Book alloc] init]; 
[book setValue:@"《Objective-C入门》" forKey:@"name"]; 
NSString *name=[book valueForKey:@"name"];

示例2:使用路径

@interface Author : NSObject { 
    NSString *name; 
}
@end

#import "Author.h"
@implementation Author
@end

@class Author;
@interface Book : NSObject { 
    NSString *name; 
    Author *author; 
}
@end

#import "Book.h"
@implementation Book
@end

Book *book=[[[Book alloc] init] autorelease]; 
[book setValue:@"《Objective-C入门》" forKey:@"name"]; 
NSString *name=[book valueForKey:@"name"]; 
    
Author *author=[[[Author alloc] init] autorelease]; 
[author setValue:@"Marshal Wu" forKey:@"name"]; 
[book setValue:author forKey:@"author"]; 
NSString *authorName=[book valueForKeyPath:@"author.name"];

示例3:自动装箱拆箱

KVC还有一个很重要的特点,自动装箱拆箱功能。这在ObjC中是仅有的,其他情况下均需要使用比如NSNumber来手动拆装箱的。

@class Author;
@interface Book : NSObject { 
    NSString *name; 
    Author *author; 
    float price; 
}
@end

实现文件没有动。

Book *book=[[[Book alloc] init] autorelease]; 
Author *author=[[[Author alloc] init] autorelease]; 
[book setValue:author forKey:@"author"]; 
[book setValue:@"zhangsan" forKeyPath:@"author.name"]; 
[book setValue:@"10.4" forKey:@"price"]; 
NSLog(@"book price is %@",[book valueForKey:@"price"]);

可以看到给price输入的是NSString类型,但是没有问题,因为KVC方式会根据字符串自动转型为适当的数值。再看打印price属性,%@是打印对象,而price属性是float基本型,这里KVC肯定做

了自动装箱的处理,将基本型转为NSNumber对象。

示例4:对集合的操作能力

KVC还具备对集合的操作能力。比如,图书可以有相关图书,这是个1对多的关系。可以用集合来表示,这里用NSArray表示,在Book类的头文件中改动:

@class Author;
@interface Book : NSObject { 
    NSString *name; 
    Author *author; 
    float price; 
    NSArray *relativeBooks; 
}
@end

如果想得到相关图书的价格NSArray,可以使用KVC方式,见main方法:

Book *book =[[[Book alloc] init] autorelease]; 
Book *book1=[[[Book alloc] init] autorelease]; 
[book1 setValue:@"5.0" forKey:@"price"]; 
Book *book2=[[[Book alloc] init] autorelease]; 
[book2 setValue:@"4.0" forKey:@"price"]; 
NSArray *books=[NSArray arrayWithObjects:book1,book2,nil]; 
[book setValue:books forKey:@"relativeBooks"]; 
NSLog(@"relative books price: %@",[book valueForKeyPath:@"relativeBooks.price"]);

日志将打印出相关图书的价格列表:

2011-05-26 19:27:57.463 ReleaseMemoDemo[10042:a0f] relative books price: ( 
    5, 
    4 
)

示例5:对集合做运算

KVC还能对集合做运算,比如想得到相关图书的个数、相关图书的价格总和、相关图书的平均价格、价格的最大值和价格的最小值,见下面的代码:

NSArray *books=[NSArray arrayWithObjects:book1,book2,nil]; 
[book setValue:books forKey:@"relativeBooks"]; 
NSLog(@"relative books price: %@",[book valueForKeyPath:@"relativeBooks.price"]); 
NSLog(@"relative books count: %@",[book valueForKeyPath:@"relativeBooks.@count"]); 
NSLog(@"relative books price sum: %@",[book valueForKeyPath:@"relativeBooks.@sum.price"]); 
NSLog(@"relative books price avg: %@",[book valueForKeyPath:@"relativeBooks.@avg.price"]); 
NSLog(@"relative books price avg: %@",[book valueForKeyPath:@"relativeBooks.@max.price"]);
NSLog(@"relative books price avg: %@",[book valueForKeyPath:@relativeBooks.@min.price]);

另外,如果想获得没有重复的价格集合,可以这样:

NSLog(@"relative books distinct price: %@",[bookvalueForKeyPath:@"relativeBooks.@distinctUnionOfObjects.price"]);

在使用@distinctUnionOfObjects后,发现效果是消除重复的价格。

示例6:更多用法

KVC还可以在一个语句中为实例的多个属性赋值:

Book *book4=[[Book alloc] init]; 
NSArray *bookProperties=[NSArray arrayWithObjects:@"name",@"price",nil]; 
NSDictionary *bookPropertiesDictionary=[book4 dictionaryWithValuesForKeys:bookProperties]; 
NSLog(@"book values: %@",bookPropertiesDictionary);
NSDictionary *newBookPropertiesDictionary=[NSDictionary dictionaryWithObjectsAndKeys:@"《Objective C入门》",@"name", @"20.5",@"price",nil]; 
[book4 setValuesForKeysWithDictionary:newBookPropertiesDictionary]; 
NSLog(@"book with new values: %@",[book4 dictionaryWithValuesForKeys:bookProperties]);
另外,还有两个比较高级的内容:nil和覆盖setNilValueForKey方法,覆盖valueForUndefinedKey方法,可自行看reference了解。

转自 http://blog.csdn.net/ajrm0925/article/details/7484678

KVC的用法的更多相关文章

  1. KVC与KVO的实现原理

    |KVC的用法 1.KVC既键值编码(Key Value Coding),基于NSKeyValueCoding协议,它是以字符串的形式来操作对象的成员变量,也就是通过字符串key来指定要操作的成员变量 ...

  2. iOS开发UI篇—Kvc简单介绍

    ios开发UI篇—Kvc简单介绍 一.KVC简单介绍 KVC key valued coding 键值编码 KVC通过键值间接编码 补充: 与KVC相对的时KVO,即key valued observ ...

  3. iOS开发技巧系列---详解KVC(我告诉你KVC的一切)

    KVC(Key-value coding)键值编码,单看这个名字可能不太好理解.其实翻译一下就很简单了,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值.而不需 ...

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

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

  5. 告诉你KVC的一切-b

    KVC(Key-value coding)键值编码,单看这个名字可能不太好理解.其实翻译一下就很简单了,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值.而不需 ...

  6. (bug更正)利用KVC和associative特性在NSObject中存储键值

    KVC 一直没仔细看过KVC的用法,想当然的认为可以在NSObject对象中存入任意键值对,结果使用时碰到问题了. 一个简单的位移动画: CAKeyframeAnimation *keyPosi=[C ...

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

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

  8. IOS中Key-Value Coding (KVC)的使用详解

    kvc,键值编码,是一个非正式的协议,它提供一种机制来间接访问对象的属性.直接访问对象是通过调用访问器的方法实现,而kvc不需要调用访问器的设置和获取方法,可以直接访问对象的属性. 下面介绍一下kvc ...

  9. KVC的特殊用法

    - (id)valueForKeyPath:(NSString *)keyPath方法的强大用法,举个例子: NSArray *array = @[@"name", @" ...

随机推荐

  1. Python自动化运维 - Django(三)CSRF - Cookie&Session

    CSRF跨站请求伪造 CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:攻击者盗用了你的身份,以你的名义发送恶意请求 ...

  2. linux percpu机制解析【转】

    转自:http://blog.csdn.net/wh8_2011/article/details/53138377 一.概述 每cpu变量是最简单也是最重要的同步技术.每cpu变量主要是数据结构数组, ...

  3. 需要重刷整個 image 的時機 - 1

    最近遇到一個問題, gpio 讀出來的值與預期不同, 詳細描述如下: 首先手機 download 了一個完整的 daily build image , 接下來 不斷地修改 kernel 部分 code ...

  4. selenium===介绍

    selenium 是支持java.python.ruby.php.C#.JavaScript . 从语言易学性来讲,首选ruby ,python 从语言应用广度来讲,首选java.C#.php. 从语 ...

  5. python3使用web.py遇到的找不属性的错误解决

    今天用pyhon安装完web.py的时候,点击运行还是没错的,但是在网页输入链接就会报错.1.安装我是这样的: pip install web.py 2.运行后错误信息是这样: AttributeEr ...

  6. 在Github里集成Readthedocs服务

    Readthedocs支持Markdown格式和sphinx格式的文档排版,是部署项目文档的绝佳平台.利用Github的托管服务,我们可以方便地将文档托管于Github,并利用Readthedocs查 ...

  7. 2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6153 A Secret KMP,思维

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6153 题意:给了串s和t,要求每个t的后缀在在s中的出现次数,然后每个次数乘上对应长度求和. 解法:关 ...

  8. javascript 常用DOM操作整理

    .选取了DOM操作中实用并常用的部分,省略了实用但有明显兼容性的部分2.DOM属性和方法的类型归属可能并不完全准确3.某些一般兼容性和特点做了标识(主要是ie8-9上下) 节点类型 节点类型 节点值 ...

  9. puppet安装和配置

    一.安装puppet准备 //安装准备 ,两台机器都要操作 . 两台机器 172.7.15.106 (server) 172.7.15.111 (client) . 关闭防火墙 setenforce ...

  10. java.lang.ClassCastException: org.springframework.web.filter.CharacterEncodingFilter cannot be cast

    严重: Exception starting filter encodingFilterjava.lang.ClassCastException: org.springframework.web.fi ...