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

    挥毫泼墨,书写人生篇章
  • 相关阅读:
    vs2017默认以管理员运行
    net abp core的appservice中访问httpcontext对象
    .net core 支持apk下载
    EF Core 2.1变化
    .Net 高效开发之不可错过的实用工具
    win10 远程出现身份验证错误 要求的函数不受支持
    分享个百度网盘下载工具
    mysql迁移sqlserver
    2020.08.11 【ABAP随笔】-ITS Mobile 配置
    2020.05.07 【ABAP随笔】- ABAP-SM30删除前检查
  • 原文地址:https://www.cnblogs.com/Jusive/p/5084250.html
Copyright © 2011-2022 走看看