KVC
2015-07-21 19:59
281 查看
什么是KVC
KVC指的就是NSKeyValueCoding非正式协议
KVC是一种间接地接受访问对象的属性机制
这种间接表现在通过字符串来标示属性,而不是通过调用来存取方法或直接地访问实例变量的方式。KVC机制不仅支持对象,还支持标量和结构体类型,这些非对象的类型会被自动的装箱和开箱Key & Key Path
键(Key)是一个字符串用来标识对象里面的一个指定的属性。一般一个键对应对象的存取方式或实例变量。键必须是ASCII码,一般以小写字母开始,不能包含空格。
键路径(Key Path)是一个由点进行分割的一系列键组成的字符串
KVC的使用
(1)获取值
- (id)valuewForKey:(NSString *)key 传入NSString属性的名字。 - (id)ValueForKeyPath:(NSString *)keyPath 传入NSString属性的路径,形式为 xx.xx。 - (id)valueForUndefinedKey:(NSString *)key 默认实现是抛出异常,可以重写这个函数左错误处理。
(2)修改值
- (void)setValue:(id)value forKey:(NSString *)key - (void)setValue:(id)value forKeyPath:(NSString *)keyPath - (void)setNilValueForKey:(NSString *)key 当对非类对象属性设置nil时,调用,默认抛出异常。
(3)一对多关系成员的情况
mutableArrayValueForKey: 有序一对多关系成员 NSArraymutableSetValueForKey: 无序一对多关系成员 NSSet
注意:
KVC与点语法是正交的,就是说与点语法没有任何关系The accessor patterns are written in the form -set :or-
KVC在集合中的使用
@avg(求属性的平均值)其中transactions为对象数组
NSNumber *transactionAverage = [transactions valueForKeyPath:@"@avg.amount"];
@count
NSNumber *numberOfTransactions = [transactions valueForKeyPath:@"@count"];
@max
NSDate *latestDate = [transactions valueForKeyPath:@"@max.date"];
@min
NSDate *earliestDate = [transactions valueForKeyPath:@"@min.date"];
@sum
NSNumber *amountSum = [transactions valueForKeyPath:@"@sum.amount"];

代码说明
Peroson.h
#import <Foundation/Foundation.h> @interface Person : NSObject { NSString *sex;//定义了一个私有成员变量 } @property (nonatomic, strong) NSString *name; @property (nonatomic)NSInteger age; @end
main.h
#import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { // 1.-----这里的缺点就是当对象的类型不确定时,不能够自动识别对象的类型 // id p = [[Person alloc]init]; // p.name = @"lijinchao";//name属性不能用点(.)语法访问因为不知道它的具体类型 // p.age = 23; // NSLog(@"%@",p); //2.------这里使用KVC的优点显而易见,kvc可以自动识别对象的类型,并进行适配 // id p = [[Person alloc] init]; // [p setValue:@"lijinchao" forKey:@"name"]; // [p setValue:@29 forKey:@"age"]; // NSLog(@"%@",p); // Person *p = [[Person alloc] init]; // p.sex = @"男";//这里由于sex没有被property和setter/getter进行封装.所以不能用点语法进行访问 // p->sex = @"女";也不能用指针方式进行访问,因为没有被封装的属性是私有的,外界无法访问 // NSLog(@"%@",p->sex); //但是KVC却解决了这个难题 [p setValue:@"男" forKey:@"sex"]; NSLog(@"sex:%@",[p valueForKey:@"sex"]);//当然了访问私有属性的值的时候也要用KVC机制进行访问 id pero = [Person personWithName:@"lijinchao" age:34]; NSLog(@"%@",pero); } return 0; }
相关文章推荐
- KVO
- Redis基本认识
- icvSetWeightsAndClasses
- 获取设置时间系统调用
- 应届生简历中常出现的问题
- Java 知识总结
- wpf 异步加载 只需6段代码
- 链表 插入排序
- HDU 5289 Assignment(2015多校训练)
- CoordinatorLayout与滚动的处理
- NSArray - 常用方法总结
- 两种视频播放形式和 视频截图
- [USACO 2012OPEN] Balanced Cow Subsets(meet in the middle + DFS)
- 大数模板
- 基于NodeJS进行前后端分离
- mongo配置副本集(replicaSet)
- Objective-C的对象模型和runtime机制
- 百练2755 神奇的口袋 背包水
- C语言 数组、函数应用实例篇
- Mac下修改环境变量