首页 > 代码库 > OC-KVC

OC-KVC

1、KVC:Key Value Coding 键值编码(键值路径)

作用:对象实例可以在类的外部对成员变量进行访问和赋值(就算成员变量是private也可以)
举例:有一个Book类:private :_name; Author *_author;
                  Author类:private:_name;
定义一个Book类的实例 book
//KVC的实现原理,系统会自动在类里面找_name的成员变量,如果没有那么就会找名叫name的成员变量
//KVC有一个缺点就是后面的key值如果写错了,程序在编译的阶段不会报错,但到了程序运行的时候会直接崩掉
[book setvalue: @“中国上下五千年” forKey @“_name”];
上面的就相当于是setter方法
[book valueForKey :@“_name”];
上面的就相当于是getter方法
 
还可以通过路径的方式获得成员变量(对象)的成员变量
[book setValue:@“老舍” forPath @“_author.name”];
提问:如果Author的name属性是private,并且没有get、set方法,那还可以进行访问么?
回答:通过路径访问的时候,_author.name,并不是点语法,只是一个路径,所以没有get、set方法也照样可以获得想要的值
 
KVC还可以通过字典批量给类的成员属性赋值,前提是字典里的键值跟类的属性名一样;
[book setValuesForKeys:dict];
 
KVC一对多关系
现有一个数组:arr 里面有三个对象:book1、book2、book3
[book valueForKeyPath:arr._name];这个方法返回这三本书作者的name;还可以这样[arr valueForKeyPath:_name];通过数据拿到里面书的所有作者,返回一个数组;这两个方法消息的接收对象和路径不一样而已
 
2、KVC的简单运算
sum、min、max、avg、count
举例:有一个Book类:private :_name; Author *_author;CGFloat _price;
                  Author类:private:_name;
定义三个Book类的实例 book1、book2、book3,现用一个数组arr来接收这三个对象;
NSNumber *count = [book valueForKeyPath:@“arr.@count”]//计算数组成员的个数
NSString *sum = [book valueForKeyPath:@“arr.@sum._price”];//计算总价格
NSString *avg = [book valueForKeyPath:@“arr.@avg._price”];//计算平均价格
NSString *max = [book valueForKeyPath:@“arr.@max._price”];//计算最高价格
NSString *min = [book valueForKeyPath:@“arr.@min._price”];//计算最低价格
KVC的缺点:在进行运算的时候,数组里面的放着的应该是同一个类的实例成员;