KVC(KeyValueCoding)的基本概念
KVC是一个用于间接访问对象属性的机制,使用该机制不需要调用存取方法和变量实例就可以访问对象属性
KVC方法在obj-c非正式协议NSKeyValue’Coding中被声明,默认的实现方法由NSObject提供
KVC支持带有对象值的属性,同时也支持纯数值类型和结构,非对象参数和返回类型会背识别并自动封装、解封
设置和访问(键值访问)
KVC中的基本调用包括- (id)valueForKey:(NSString *)key;和- (void)setValue:(id)value forKey:(NSString *)key;这两个方法,他们以字符串的形式向对象发送消息,字符串是我们关注属性的关键。
如果不存在set和get方法,它将在内部查找名为key或_key的示例变量(name或_name)。通过KVC可以获取不存在get方法的对象值,无需通过对象指针直接访问。
在设置对象的值时,若对象的实例变量为基本数据类型(char、int、float、BOOL),需要对数据进行封装。
路径访问
KVC还支持路径访问,像文件系统一样,用 “.” 号分割。
一对多的访问
如果向NSArray请求一个键值,它实际上会查询数组中的每个对象来查找这个键值,然后将查询结果打包到另一个数组中并返回给你
KVC的简单运算
可以利用KVC做一些简单运算,sum、min、max、avg、count
运算的字段必须是数值类型NSNumber或者基本数据类型,计算的结果是NSNumber
示例代码:
Book.h
#import <Foundation/Foundation.h> #import "Author.h" @interface Book : NSObject { NSString *name; Author *author; NSArray *other; } @end
Book.m
#import "Book.h" @implementation Book @end
Author.h
#import <Foundation/Foundation.h> @interface Author : NSObject @property(nonatomic,copy)NSString *name; @end
Author.m
#import "Author.h" @implementation Author @end
main.m
#import <Foundation/Foundation.h> #import "Book.h" int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSLog(@"Hello, World!"); //键值访问 Book *book = [[Book alloc]init]; [book setValue:@"三体2:黑暗森林" forKey:@"name"];//设置 NSLog(@"%@",[book valueForKey:@"name"]);//访问 //路径访问 Author *author = [[Author alloc]init]; author.name = @"刘慈欣"; [book setValue:author forKey:@"author"]; NSLog(@"%@",[book valueForKeyPath:@"author.name"]);//此处的点是路径分割,不是点语法 //一对多 NSMutableArray *arr = [[NSMutableArray alloc]init]; for (int i = 0; i<3; i++) { Book *book = [[Book alloc]init]; NSString *name = [NSString stringWithFormat:@"other_%d",i]; [book setValue:name forKey:@"name"]; [arr addObject:book]; } [book setValue:arr forKey:@"other"]; NSLog(@"%@",[book valueForKeyPath:@"other.name"]); NSArray *arr1 = [arr valueForKeyPath:@"name"]; NSLog(@"%@",arr1); //KVC的简单运算 NSLog(@"%@",[book valueForKeyPath:@"other.name.@count"]);//查看个数 /* [XXX valueForKeyPath:@"路径key.@sum.要进行运算的key"]//在运算中,先写入第一个路径,在最后要运算的属性前加@sum、@min等等,
运算的字段必须是数值类型NSNumber或者基本数据类型,计算的结果是NSNumber */ } return 0; }
运行结果:
2014-01-02 13:14:45.219 KVC[1387:303] Hello, World! 2014-01-02 13:14:45.221 KVC[1387:303] 三体2:黑暗森林 2014-01-02 13:14:45.221 KVC[1387:303] 刘慈欣 2014-01-02 13:14:45.221 KVC[1387:303] ( "other_0", "other_1", "other_2" ) 2014-01-02 13:14:45.222 KVC[1387:303] ( "other_0", "other_1", "other_2" ) 2014-01-02 13:14:45.222 KVC[1387:303] 3