1、首先,先做一个模型,用来说明
@interface Car : NSObject <NFirstCopying>
@property (nonatomic,copy)NSString *name;
@property (nonatomic,copy)NSString *make;
@property (nonatomic,copy)NSString *mode;
@property (nonatomic,strong)Engine *engine;
@property (nonatomic,strong)NSMutableArray *tiers;
@end
2、KVC中基本调用包括 -valueForKey -setValue:forKey:
NSString *name = [car valueForKey:@"name"];
NSLog(@"%@",name);
valueForKey:首先查找以键-key或-iskey命名的getter方法,如果不存在,则在对象内部查找名为_key或者key的实例变量,如果仍然没有,则报错
对于-setValue:forKey:和-valueForKey一样,也会先查找-setName,如果不存在,则在类中查找名为name或_name的变量,进行赋值
而且KVC有自动包装功能
3、路径
@interface Engine : NSObject <NSCopying>
{
int horsepower;
}
@end //Engine
- id init
{
if(self = [super init])
{
horsepower = 145;
}
return (self);
}
我们想设置一下马力,这样捉
[engine setValue: [NSNumber numberWithInt:150] forKey: @"horsepower"];
NSLog(@"horsepower is %@",[engine valueForKey:@"horsepwoer"]);
当然,这不是我们要讲的路径,下面我们来看看路径,这样比一些列的嵌套方法调用更容易访问对象
NSLog(@"horsepower is %@",[car valueForKeyPath: @"engine.horsepower"]);
4、整体操作
对于KVC来说,如果想NSArray请求一个键值,它实际上会查询数组中的每个对象来查找这个键值,然后将查询结果打包到另一个数组中并返回给你。
对于这个demo来说,Car和Tire之间是一对多的关系。
NSArray *pressures = [car valueForKeyPath: @"tires.pressure"];
NSLog(@"pressures %@", pressures);
这里,程序会向NSArray中的每一个对象,发送一个valueForKeyPath:消息,并且使用pressure作为键路径
5、一些方法
让我们先来加一个类Garage
@class Car
@interface Garage : NSObject
@property (nonatomic,copy)NSString *name;
@property(nonatomic,strong)NSMutableArray *cars;
- (void) addCar: (Car *) car;
然后声明一个这个类的对象
然后调用这个对象的添加,向其中添加一些对象
Garage *garage = [[Garage alloc]init];
[garage addCar:...];
NSNumber *count;
count = [garage valueForKeyPath:@"cars.@count"];
NSNumber *sum;
sum = [garage valueForKeyPath: @"cars.@sum.mileage"];
NSNumber *avgMileage;
avgMileage = [garage valueForKeyPath: @"cars.@avg.mileage"];
按照某一种属性,进行groupBy
NSArray *manufacturers;
manufacturers = [garage valueForKeyPath: @"cars.@distinctUnionOfObjects.make"];
如果想单独使用的时候,一定记得要在distinct前面加@
6、使用空
如果想为某一个位置设置空,那么应该
-setNilValueForKey: