1、KVC基本用法:
设置和访问:
键/值编码中的基本调用包括-valueForKey:和-setValue: forKey:
这两个方法,它们以字符串的形式向对象发送消息,字符串是我们关注属性的关键。
是否存在setter、getter方法,如果不存在,它将在内部查找名为_key或key的实例变量。通过KVC,可以获取不存在getter方法的对象值,无需通过对象指针直接访问。
需要注意的是:当我们通过setValue: forKey: 设置对象的值,或通过valueForKey来获取对象的值,如果对象的实例变量为基本数据类型(char、int、float、BOOL)时,我们需要对数据进行封装。
例如:
[per setValue:@"22" forKey:@"age"]; // 先寻找age变量,没有找到。再找_age变量对其赋值
[per setValue:@23 forKey:@"age"]; // 会自动进行类型转换进行赋值
(也就是说setValue的标签参数只要是个对象即可,可以是NSNumber类型即@22 也可以是字符串类型@“22” KVC都会进行自动转换进行赋值的)
2、KVC路径的使用
路径:除了通过设置值外,键/值编码还支持指定路径,像文件系统一样用圆点隔开。
[book setValue:@“比尔”forKeyPath:@“author._name”];
[book valueForKeyPath:@“relativeBooks.price”];
路径使用总结:当一个类中有别的类的对象作为成员变量时,如果要访问对象成员的内部变量时就需要使用forKeyPath。
KVC运算之一对多关系:
如果向NSArray请求一个键值,它实际上会查询数组中的每一个对象来查找这个键值,然后将查询结果打包到另外一个数组并返回给你。
NSArray *booksArray = [NSArray arrayWithObjects:book1,book2, nil];
[book1 release];
[book2 release];
[book setValue:booksArray forKey:@“relativeBooks”];
NSLog(@“books 2: %@”,[book valueForKeyPath:@“relativeBooks.price”]);
KVC之一对多关系如下:
当一个类中有一个专门存放别的类对象的数组变量作为成员。当要访问数组中每一个相同对象的同一属性时可以用如下格式进行处理:1> NSArray *array = [ 类对象 valueForKeyPath:成员数组.数组中存放对象的某一属性名] ;
这样就可以把成员数组中每一个对象的指定属性名的变量存放到一个新的数组中。
2> NSNumber *count = [ 类对象 valueForKeyPath:成员数组.@count];
可以把成员数组中存放的对象的个数取出。因为KVC处理的都是对象类型取出的个数也是NSNumber类型,所以取出取出时要用NSNumber指针变量来进行接收。
3> NSNumber *sum = [ 类对象 valueForKeyPath:成员数组.@sum.存放对象中的某一数值属性];
可以把成员数组中存放的所有对象指定属性的值进行求和并返回。
4> NSNumber *avg = [ 类对象 valueForKeyPath:成员数组.@avg.存放对象中的某一数值属性];
可以对成员数组中存放的所有对象指定属性的值进行求平均值运算并返回此属性值的平均值。
当@avg变成@min或@max时,分别表示返回数组成员存放对象中指定属性的最大值或最小值。
具体代码如下:
在main.m中编辑如下:
设置和访问:
键/值编码中的基本调用包括-valueForKey:和-setValue: forKey:
这两个方法,它们以字符串的形式向对象发送消息,字符串是我们关注属性的关键。
是否存在setter、getter方法,如果不存在,它将在内部查找名为_key或key的实例变量。通过KVC,可以获取不存在getter方法的对象值,无需通过对象指针直接访问。
需要注意的是:当我们通过setValue: forKey: 设置对象的值,或通过valueForKey来获取对象的值,如果对象的实例变量为基本数据类型(char、int、float、BOOL)时,我们需要对数据进行封装。
例如:
[per setValue:@"22" forKey:@"age"]; // 先寻找age变量,没有找到。再找_age变量对其赋值
[per setValue:@23 forKey:@"age"]; // 会自动进行类型转换进行赋值
(也就是说setValue的标签参数只要是个对象即可,可以是NSNumber类型即@22 也可以是字符串类型@“22” KVC都会进行自动转换进行赋值的)
2、KVC路径的使用
路径:除了通过设置值外,键/值编码还支持指定路径,像文件系统一样用圆点隔开。
[book setValue:@“比尔”forKeyPath:@“author._name”];
[book valueForKeyPath:@“relativeBooks.price”];
路径使用总结:当一个类中有别的类的对象作为成员变量时,如果要访问对象成员的内部变量时就需要使用forKeyPath。
KVC运算之一对多关系:
如果向NSArray请求一个键值,它实际上会查询数组中的每一个对象来查找这个键值,然后将查询结果打包到另外一个数组并返回给你。
NSArray *booksArray = [NSArray arrayWithObjects:book1,book2, nil];
[book1 release];
[book2 release];
[book setValue:booksArray forKey:@“relativeBooks”];
NSLog(@“books 2: %@”,[book valueForKeyPath:@“relativeBooks.price”]);
KVC之一对多关系如下:
当一个类中有一个专门存放别的类对象的数组变量作为成员。当要访问数组中每一个相同对象的同一属性时可以用如下格式进行处理:1> NSArray *array = [ 类对象 valueForKeyPath:成员数组.数组中存放对象的某一属性名] ;
这样就可以把成员数组中每一个对象的指定属性名的变量存放到一个新的数组中。
2> NSNumber *count = [ 类对象 valueForKeyPath:成员数组.@count];
可以把成员数组中存放的对象的个数取出。因为KVC处理的都是对象类型取出的个数也是NSNumber类型,所以取出取出时要用NSNumber指针变量来进行接收。
3> NSNumber *sum = [ 类对象 valueForKeyPath:成员数组.@sum.存放对象中的某一数值属性];
可以把成员数组中存放的所有对象指定属性的值进行求和并返回。
4> NSNumber *avg = [ 类对象 valueForKeyPath:成员数组.@avg.存放对象中的某一数值属性];
可以对成员数组中存放的所有对象指定属性的值进行求平均值运算并返回此属性值的平均值。
当@avg变成@min或@max时,分别表示返回数组成员存放对象中指定属性的最大值或最小值。
具体代码如下:
新建工程如下:
新建一个读者类:
编辑Author.h如下:
//
// Author.h
// KVC的基本用法
//
// Created by apple on 15/9/20.
// Copyright (c) 2015年 LiuXun. All rights reserved.
//
#import <Foundation/Foundation.h>
// 作者类——>书籍1、书籍2、书籍3
@interface Author : NSObject
{
@private
NSString *_name; // 作者姓名
// 作者出版的书
NSArray *_issueBook;
}
@end
新建book类
编辑Book.h如下:
//
// Book.h
// KVC的基本用法
//
// Created by apple on 15/9/20.
// Copyright (c) 2015年 LiuXun. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Author.h"
// 书籍类
@interface Book : NSObject
{
@private
Author *_author; // 书的作者
}
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) float price;
@end
在main.m中编辑如下:
//
// main.m
// KVC的基本用法
//
// Created by apple on 15/9/20.
// Copyright (c) 2015年 LiuXun. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Book.h"
#import "Author.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Book *book = [[Book alloc] init];
Author *author = [[Author alloc] init];
[book setValue:author forKey:@"author"];
// 通过键值路径设置属性值
[book setValue:@"莫言" forKeyPath:@"author.name"];
NSString *name = [author valueForKey:@"name"];
NSLog(@"name= %@",name);
// 通过键值路径,访问属性值
NSString *nam = [book valueForKeyPath:@"author.name"];
NSLog(@"nam = %@",nam);
/*---------------------根据KVC一对多关系进行运算--------------------------*/
Author *author2 = [[Author alloc] init];
[author2 setValue:@"莫言" forKey:@"name"];
Book *book1 = [[Book alloc] init];
book1.name = @"红高粱";
book1.price = 9.9;
Book *book2 = [[Book alloc] init];
book2.name = @"蛙";
book2.price = 10;
Book *book3 = [[Book alloc ] init];
book3.name = @"平凡的世界";
book3.price =5;
NSArray *books = [[NSArray alloc] initWithObjects:book1,book2,book3, nil];
[author2 setValue:books forKey:@"issueBook"];
// 获取数组中所有book对象的书名
NSArray *bookNamArray = [author2 valueForKeyPath:@"issueBook.name"];
NSLog(@"bookNamArray: %@",bookNamArray);
// 获取数组中所有book对象的价格
NSArray *priceArray = [author2 valueForKeyPath:@"issueBook.price"];
NSLog(@"priceArray: %@",priceArray);
// 获取数组中book对象的个数
NSNumber *count = [author2 valueForKeyPath:@"issueBook.@count"];
NSLog(@"count= %@",count);
// 计算数组中所有book对象的价格总和
NSNumber *num = [author2 valueForKeyPath:@"issueBook.@sum.price"];
NSLog(@"sumofPrice= %@",num);
// 计算数组中所有book对象价格的平均值
NSNumber *avg = [author2 valueForKeyPath:@"issueBook.@avg.price"];
NSLog(@"avgofPrice= %@",avg);
// 取得数组中所有book对象中价格的最大值
NSNumber *max = [author2 valueForKeyPath:@"issueBook.@max.price"];
NSLog(@"maxofPrice= %@",max);
// 取得数组中所有book对象中价格的最小值
NSNumber *min = [author2 valueForKeyPath:@"issueBook.@min.price"];
NSLog(@"minofPrice= %@",min);
}
return 0;
}
运行结果如下: