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

    挥毫泼墨,书写人生篇章
  • 相关阅读:
    什么是J2EE
    JSE,JEE,JME三者之间有什么区别
    windows下git显示文件被修改,实际没有改动的问题解决办法
    laravel 多个项目共享SESSION
    laravel 共享session问题总结
    laravel5 报错419,form 添加crrf_field 后让然失败,本地环境配置问题
    QQ互联登录提示redirect uri is illegal(100010)完美解决方法
    vim鼠标模式打开与关闭
    HTML5----响应式(自适应)网页设计
    file_put_contents () failed to open stream: Permission denied 解决办法
  • 原文地址:https://www.cnblogs.com/Jusive/p/5084250.html
Copyright © 2020-2023  润新知