键值编码的基本概念和用法
键值编码的基本概念
1.键-值编码是一个用于间接访问对象属性的机制,使用该机制不需要调用存取方法和变量实例就可访问对象属性。
2.键-值编码方法在Objective-C非正式协议(类目)NSKeyValueCoding中被声明,默认的实现方法由NSObject提供。
3.键-值编码支持带有对象值的属性,同时也支持纯数值类型和结构。非对象参数和返回类型会被识别并自动封装/解封。
KVC的基本用法
1.设置和访问
键/值编码中得基本调用包括-valueForKey: 和-setValue:forKey:这两个方法,它们以字符串的形式向对象发送消息,字符串是我们关注属性的关键。
Book *book = [[Book alloc]init];
NSMutableString *name = [[NSMutableString alloc] initWithFormat:@“jack”];
[book setValue:name forKey:@“name”];
NSLog(@“jack name:%@“,[book valueForKey:@“name”]);
是否存在setter、getter方法,如果不存在,它将在内部查找名为_key或key的实例变量。通过KVC,可以获取不存在getter方法的对象值,无需通过对象指针直接访问。
注意:当我们通过setValue:forKey:设置对象的值,或通过valueForKey来获取对象的值时,如若对象的实例变量为基本数据类型时(char,int,float,BOOL),我们需要对数据进行封装。
路径与一对多的关系
1.路径
除了通过键设置值之外,键/值编码还支持指定路径,像文件系统一样。用“点”号隔开。
[book setValue:@“比尔” forKeyPath:@“author._name”];
[book valueForKeyPath:@“realBooks.price”];
2.一对多的关系
如果向NSArray请求一个键值,它实际上会查询数组中的每个对象来查找这个键值,然后将查询结果打包到另一个数组中并返回给你。
NSArray *booksArray = [NSArray arrayWithObjects:book1,book2,nil];
[book setValue:booksArray forKey:@“realBooks.price”]);
NSLog(@“books 2:%@“,[book valueForKeyPath:@“realBooks.price”]);
/******************Book.h**********************/
@interface Book : NSObject
{
@private
NSString *_name;
NSString *_author; //书的作者
NSArray *_relativeBooks; //相关的书籍
}
/******************main函数******************/
Book *book = [[Book alloc]init];
Author *author = [[Author alloc]init];
[author setValue:@"jack" forKey:@"_name"];
//键值访问
[book setValue:@"ipad developer" forKey:@"name"];
NSString *authorName = [book valueForKeyPath:@"_author._name"];
NSLog(@"%@",authorName);
//一对多
NSMutableArray *releBooks = [NSMutableArray arrayWithCapacity:3];
for (int i = 0; i < 3; i++) {
Book *book = [[Book alloc] init];
NSString *name = [NSString stringWithFormat:@"job_%d",i];
[book setValue:name forKey:@"_name"];
[releBooks addObject:book];
[book release];
}
[book setValue:releBooks forKey:@"_relativeBooks"];
/*方法一*/
// NSArray *names = [book valueForKeyPath:@"_relativeBooks._name"];
// NSLog(@"%@",names);
/*方法二*/
NSArray *names = [releBooks valueForKeyPath:@"_name"];
NSLog(@"%@",names);
利用KVC实现简单的运算
此外,还可以应用一些字符做简单运算。sum,min,max,avg,count.
[book setValue:[NSNumber numberWithFloat:12.6]forKey:@"price"];
NSNumber *price = [book valueForKeyPath:@"price"];
NSLog(@"%@",price);
[book setValue:@(12+i) forKey:@"price"];
//运算
NSNumber *sum = [book valueForKeyPath:@"_relativeBooks.@sum.price"];
NSLog(@"sum:%@",sum);
【运算的字段必须是数值类型NSNumber或者基本数据类型,计算的结果是NSNumber】
键值编码的基本概念
1.键-值编码是一个用于间接访问对象属性的机制,使用该机制不需要调用存取方法和变量实例就可访问对象属性。
2.键-值编码方法在Objective-C非正式协议(类目)NSKeyValueCoding中被声明,默认的实现方法由NSObject提供。
3.键-值编码支持带有对象值的属性,同时也支持纯数值类型和结构。非对象参数和返回类型会被识别并自动封装/解封。
KVC的基本用法
1.设置和访问
键/值编码中得基本调用包括-valueForKey: 和-setValue:forKey:这两个方法,它们以字符串的形式向对象发送消息,字符串是我们关注属性的关键。
Book *book = [[Book alloc]init];
NSMutableString *name = [[NSMutableString alloc] initWithFormat:@“jack”];
[book setValue:name forKey:@“name”];
NSLog(@“jack name:%@“,[book valueForKey:@“name”]);
是否存在setter、getter方法,如果不存在,它将在内部查找名为_key或key的实例变量。通过KVC,可以获取不存在getter方法的对象值,无需通过对象指针直接访问。
注意:当我们通过setValue:forKey:设置对象的值,或通过valueForKey来获取对象的值时,如若对象的实例变量为基本数据类型时(char,int,float,BOOL),我们需要对数据进行封装。
路径与一对多的关系
1.路径
除了通过键设置值之外,键/值编码还支持指定路径,像文件系统一样。用“点”号隔开。
[book setValue:@“比尔” forKeyPath:@“author._name”];
[book valueForKeyPath:@“realBooks.price”];
2.一对多的关系
如果向NSArray请求一个键值,它实际上会查询数组中的每个对象来查找这个键值,然后将查询结果打包到另一个数组中并返回给你。
NSArray *booksArray = [NSArray arrayWithObjects:book1,book2,nil];
[book setValue:booksArray forKey:@“realBooks.price”]);
NSLog(@“books 2:%@“,[book valueForKeyPath:@“realBooks.price”]);
/******************Book.h**********************/
@interface Book : NSObject
{
@private
NSString *_name;
NSString *_author; //书的作者
NSArray *_relativeBooks; //相关的书籍
}
/******************main函数******************/
Book *book = [[Book alloc]init];
Author *author = [[Author alloc]init];
[author setValue:@"jack" forKey:@"_name"];
//键值访问
[book setValue:@"ipad developer" forKey:@"name"];
[book setValue:author forKey:@"_author"];
//路径访问
[book setValue:@"tom" forKeyPath:@"author.name"];NSString *authorName = [book valueForKeyPath:@"_author._name"];
NSLog(@"%@",authorName);
//一对多
NSMutableArray *releBooks = [NSMutableArray arrayWithCapacity:3];
for (int i = 0; i < 3; i++) {
Book *book = [[Book alloc] init];
NSString *name = [NSString stringWithFormat:@"job_%d",i];
[book setValue:name forKey:@"_name"];
[releBooks addObject:book];
[book release];
}
[book setValue:releBooks forKey:@"_relativeBooks"];
/*方法一*/
// NSArray *names = [book valueForKeyPath:@"_relativeBooks._name"];
// NSLog(@"%@",names);
/*方法二*/
NSArray *names = [releBooks valueForKeyPath:@"_name"];
NSLog(@"%@",names);
利用KVC实现简单的运算
此外,还可以应用一些字符做简单运算。sum,min,max,avg,count.
[book setValue:[NSNumber numberWithFloat:12.6]forKey:@"price"];
NSNumber *price = [book valueForKeyPath:@"price"];
NSLog(@"%@",price);
[book setValue:@(12+i) forKey:@"price"];
//运算
NSNumber *sum = [book valueForKeyPath:@"_relativeBooks.@sum.price"];
NSLog(@"sum:%@",sum);
【运算的字段必须是数值类型NSNumber或者基本数据类型,计算的结果是NSNumber】