KVC是OC特有的,本质是在运行时动态的给对象发送setValue:forKey 消息,设置数值 -调用super.init 保证对象已经被创建完成 .当给对象发送setValue:forKey 消息时要判断对象是否存在key所对应的属性,直接赋值 如果没有就调用undefinedKey(默认崩溃,需要重写)
先去检查是否存在setter,getter方法,如果不存在,它将在内部查找名_key或key的实例变量。如果
还是没有那就会报错误。通过KVC 可以获取不存在getter方法的对象值,无需通过对象指针直接访问。
如果对象的实例变量为基本数据类型时(例如:char,int,float,BOOL),我们需要对这些数据类型进行封装。
setValue:forKey的调用顺序首先会寻找set<key>方法,如果没有就去找_<key> _is<Key> <key> is<key> 顺序寻找,如何还没找到就调用undefinedKey(默认崩溃,需要重写).
ValueForKey的调用顺序 按照get<key>, <key> is<key> 顺序寻找,如果没有找到按照_<key> _is<key> <key> is<key>顺序寻找,如何还没找到就调用undefinedKey(默认崩溃,需要重写).
KVC的价值:
1.可以访问私有成员的值
2.可以间接修改私有成员变量的值(替换系统自带的导航栏,tabBar)
3.应用一些字符做简单运算(sum,min,max,avg,count)比如直接计算数组元素之间的关系
//属性相加
NSString *sum= [persons valueForKeyPath:@"Person.@sum.age"];
NSLog(@"sum = %@",sum);
//数量
NSString *count= [persons valueForKeyPath:@"Person.@count.age"];
NSLog(@"count = %@",count);
//最大值
NSString *max= [persons valueForKeyPath:@"Person.@max.age"];
NSLog(@"max = %@",max);
//最小值
NSString *min= [persons valueForKeyPath:@"Person.@min.age"];
NSLog(@"min = %@",min);
//平均值
NSString *avg= [persons valueForKeyPath:@"Person.@avg.age"];
NSLog(@"avg = %@",avg);
valueForKeyPath和valueForKey的区别:
前者其实可以完全包含后者的
Key:只能访问当前对象的属性
KeyPath:能利用运算符一层一层往内部访问属性