zoukankan      html  css  js  c++  java
  • IOS中Key-Value Coding (KVC)的使用具体解释

      kvc。键值编码,是一个非正式的协议。它提供一种机制来间接訪问对象的属性。

    直接訪问对象是通过调用訪问器的方法实现,而kvc不须要调用訪问器的设置和获取方法。能够直接訪问对象的属性。

      以下介绍一下kvc的使用方法:

    1、对属性赋值

      kvc是通过键值对的方式对属性设置值,提供了以下的方法。相当于訪问器中的set方法。value为要设置的值,key是字符串,字符串中内容为为属性的名称

    - (void)setValue:(id)value forKey:(NSString *)key;
    - (void)setValue:(id)value forKeyPath:(NSString *)keyPath;

      以下通过一个小样例解说一下通过訪问器和kvc对属性赋值的代码实现。

      如果Student类中有一个name属性,直接对name赋值的方式为:

    Student *stu = [[Student alloc] init];
    stu.name = @"jerehedu";

      通过kvo对name进行赋值:

    Student *stu = [[Student alloc] init];
    [stu setValue:@"jerehedu" forKey:@"name"];

      如果学生类中另一个属性为ClassInfo班级类的对象stuClass,在ClassInfo班级类中有个classNo班级号的属性。以下通过直接的方式设置班级号:

    stu.stuClass = [ClassInfo new];
    stu.stuClass.classNo = 1;

      通过kvc设置班级号:

    stu.stuClass = [ClassInfo new];
    [stu setValue:@(1) forKeyPath:@"stuClass.classNo"];

      通过keyPath设置时,路径由 xx.xx 表示;

      value的值为OC对象。假设为基本数据类型。须要进行装箱。也就是包装为OC对象。

    2、获取属性的值

      kvc提供了获取对象属性值的方法,相当于訪问器的get方法,取值的时候也是通过键值对方式。

    - (id)valueForKey:(NSString *)key;
    - (id)valueForKeyPath:(NSString *)keyPath;

      以下通过一个小样例解说一下通过訪问器和kvc对属性取值的代码实现。

      如果要获取Student类中name的值。直接对name取值的方式为: 

    NSString *name = stu.name;

      通过kvc取值的方式为:

    NSString *name = [stu valueForKey:@"name"];

      通过訪问器方法直接从Student类中取班级号:

    int num = stu.stuClass.classNo;

      通过kvc取Student类中中班级号:

    int num = [[stu valueForKeyPath:@"stuClass.classNo"] intValue];

      默认取到的值为OC对象。假设想得到基本数据类型,须要进行拆箱操作。

    3、key找不到时。处理异常

      使用kvc时。假设代码中的key值不存在,会抛出异常,能够在类中通过重写它提供以下的这种方法来解决问题。

    - (void)setValue:(id)value forUndefinedKey:(NSString *)key;

      当key不存在时。会自己主动调用上面的这种方法,能够在这种方法中进行处理。

    4、kvc的使用方法补充

      kvc很好用,能够简化我们的代码,除了能够不用通过訪问器方法,直接对属性进行訪问外,还能够对对象中的属性进行运算。

      比方新加入一个Test測试类,里面有一个score分数的属性,在Student类中有一个数组。数组中存放考试信息(Test类对象),通过kvo能够直接得到数组中存储的全部考试的平均成绩、最好成绩等。

      通过kvo存储考试数组信息:

            NSMutableArray *ary = [NSMutableArray array];
            for (int i=0; i<5; i++) {
                Test *test = [[Test alloc] init];
                [test setValue:@(100-10*i) forKey:@"score"];
                [ary addObject:test];
            }
        stu.testAry = ary;

      在Student类中将考试打印信息输出:

    NSLog(@"show: testAry = %@ ",[self valueForKey:@"testAry"]);
    
        NSLog(@"show: testAry.score = %@",[self.testAry valueForKey:@"score"] );
    
        NSLog(@"show: testAry.score = %@",[self.testAry valueForKeyPath:@"score"] );
        
        NSLog(@"show: 数组中总成绩SUMscore = %@",[self.testAry valueForKeyPath:@"@sum.score"] );
        NSLog(@"show2: 数组中平均成绩AVGscore = %@",[self.testAry valueForKeyPath:@"@avg.score"] );
        NSLog(@"show2: 数组中最大成绩MAXscore = %@",[self.testAry valueForKeyPath:@"@max.score"] );
        NSLog(@"show2: 数组中最小成绩MINscore = %@",[self.testAry valueForKeyPath:@"@min.score"] );

      疑问咨询或技术交流。请增加官方QQ群:JRedu技术交流 (452379712)

    作者:杰瑞教育
    出处:http://blog.csdn.net/jerehedu/ 
    本文版权归烟台杰瑞教育科技有限公司和CSDN共同拥有,欢迎转载。但未经作者允许必须保留此段声明。且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
     
  • 相关阅读:
    Docker 日志都在哪里?怎么收集?
    docker link 过时不再用了?那容器互联、服务发现怎么办?
    Centos7.0 配置docker 镜像加速
    使用docker搭建公司redmine服务器
    Jenkins pipeline:pipeline 使用之语法详解
    Xcode脚本自动化打包问题:xcrun: error: unable to find utility "PackageApplication", not a developer tool or in PATH
    java基础(7)---IO流
    java基础(6)---面向对象,类,包
    java基础(5)---内存分配
    java基础(4)---引用数据类型(数组、字符串、集合)
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5195056.html
Copyright © 2011-2022 走看看