访次: AmazingCounters.com 次

KVC的底层实现原理

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:能利用运算符一层一层往内部访问属性

posted @ 2015-12-28 22:31  JusDoit  阅读(5289)  评论(0编辑  收藏  举报