zoukankan      html  css  js  c++  java
  • 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:能利用运算符一层一层往内部访问属性

    挥毫泼墨,书写人生篇章
  • 相关阅读:
    java基础(7)--方法
    java基础(6)--数组和方法
    java基础(5)--流程控制结构
    java基础(4)--运算符及表达式
    java基础(2)--进制
    Java基础(1)--JDK,变量
    quartz(8)--其他
    spring AOP 概述(三) Advisor
    spring AOP 概述(二) Pointcut
    spring AOP 概述(一) Advice
  • 原文地址:https://www.cnblogs.com/Jusive/p/5084250.html
Copyright © 2011-2022 走看看