kvc的基本概念:键值编码是一个用于间接访问对象属性的机制,使用这个机制不用调用存取方法和变量实例,就可以访问对象的属性。
键值编码方法在OC非正式协议NSKEYVALUECoding中声明,默认的实现方法有NSObject提供。
键值编码支持有对象值的属性,同时也支持带有纯数据类型和结构,非对参数和返回类型会被识别并自动封装。
kvc的基本用法
1.设置和访问
键值编码包括setValue:forkey 和valueForKey这两个基本用法,首先看这个对象有没有setter和getter方法,如果不存在
,它将在内部查找名为_key或者key的实例变量。通过kvc可以获取不存在getter方法的对象的属性值和设置不存在setter方法的对象的属性值。在使用setValue:forkey 和valueForKey方法的时候要注意要对对象的基本数据类型如(int 、float、 bool、char)进行装箱封装。
Deveice *mac =[[Deveice alloc]init];
[mac setValue:@"macbook" forKey:@"name"];
[mac setValue:@8000 forKey:@"price"];
NSString *name =[mac valueForKey:@"name"];
NSLog(@"==%@",name);
2.路径
键值编码还可以支持制定路径,用.隔开
NSNumber *number = [ps valueForKeyPath:@"deceiveArray.@sum.price"];
NSLog(@"%@",number);
3.一对多的关系
向数组请求一个键值,它会遍历这个数组中的每一个对象来查找这个键值,然后将查询到的结果存放到另一个数组返回给你;
person *ps =[[person alloc]init];
Deveice *mac =[[Deveice alloc]init];
[mac setValue:@"macbook" forKey:@"name"];
[mac setValue:@8000 forKey:@"price"];
NSString *name =[mac valueForKey:@"name"];
NSLog(@"==%@",name);
Deveice *iPhone =[[Deveice alloc]init];
[iPhone setValue:@"iphone" forKey:@"name"];
[iPhone setValue:@5000 forKey:@"price"];
Deveice *iPad =[[Deveice alloc]init];
[iPad setValue:@"ipad" forKey:@"name"];
[iPad setValue:@3800 forKey:@"price"];
NSArray *nameArray =@[mac,iPhone,iPad];
[ps setValue:@"jobs" forKeyPath:@"name"];
[ps setValue:nameArray forKey:@"deceiveArray"];
NSNumber *number = [ps valueForKeyPath:@"deceiveArray.@sum.price"];
NSLog(@"%@",number);
NSLog(@"%@",[ps valueForKey:@"name"]);
kvc的简单运算
如 count,min,max,avg,sum
语法格式要在做这些运算前加上@,比如@sum,@min
NSNumber *number = [ps valueForKeyPath:@"deceiveArray.@sum.price"];
NSLog(@"%@",number);