• KVC的取值和赋值


    .m文件

     1 #import <Foundation/Foundation.h>
     2 #import "Person.h"
     3 int main(int argc, const char * argv[]) {
     4     @autoreleasepool {
     5         /*
     6          KVC:全称Key Value Coding 是间接访问对象实例变量的方式 为对象中对应的实例变量赋值
     7          用setValue:forKey:
     8          赋值原理:给定一个Key,比如name
     9          1.先查找对象中有没有对应的setName方法,如果有直接调用该方法进行赋值,如果没有转步骤2
    10          2.再查找对象中有没有定义实例变量为_那么,如果有直接为该实例变量赋值,否则转步骤3
    11          3.查找对象中有没有定义实例变量叫做name,如果有直接为实例变量赋值,否则转步骤4
    12          4.自动调用对象中的方法setValue:forUndefinedKey:
    13          KVC取值过程:调用valueForKey:给定一个Key比如name
    14          1.查找对象中有没有对应的getter方法,如果有则调用该方法返回对应的实例变量的值,如果没有转步骤2
    15          2.再查找有没有定义对应的_name实例变量,如果有直接取出该实例变量存储的值,否则转步骤3
    16          3.再查找有没有定义对应的name实例变量,如果有直接取出该实例变量存储的值,否则转步骤4
    17          4.自动调用对象中的方法Value:forUndefindKey:
    18          
    19          */
    20         //KVC赋值过程
    21         Person *person = [[Person alloc] init];
    22         [person setValue:@"皮拉夫大王" forKey:@"name"];
    23         [person setValue:@"孙悟空" forKey:@"name"];
    24         
    25         NSLog(@"%@",person.name);
    26         //KVC取值过程
    27         NSLog(@"%@",[person valueForKey:@"name"]);
    28         //setValue:forKeyPath:根据路径给实例变量赋值或取值
    29         [person setValue:@"乐乐" forKeyPath:@"person.name"];
    30         NSLog(@"%@",[person valueForKeyPath:@"person.name"]);
    31         //使用KVC把字典封装成对象
    32         NSDictionary *dict = @{@"name":@"小明",@"sex":@"",@"address":@"你猜"};
    33         //        person.name = [dict objectForKey:@"name"];
    34         //        person.sex = [dict objectForKey:@"sex"];
    35         //        person.address = [dict objectForKey:@"address"];
    36 
    37         [person setValuesForKeysWithDictionary:dict];
    38         NSLog(@"%@",person);
    39         
    40     }
    41     return 0;
    42 }

    使用KVC把字典封装成对象,用来赋值比直接给对象赋值方便

    Person.h文件

    1 #import <Foundation/Foundation.h>
    2 
    3 @interface Person : NSObject
    4 @property (nonatomic, retain)NSString *name;
    5 @property (nonatomic, retain)NSString *sex;
    6 @property (nonatomic, retain)NSString *address;
    7 @end

    Person.m文件

     1 @implementation Person
     2 -(id)valueForUndefinedKey:(NSString *)key
     3 {
     4     NSLog(@"玲玲说敲了代码就找到老婆了");
     5     return nil;
     6 }
     7 //如果没有对应的key,那么系统自动调用下面的方法,该方法默认抛出一个异常,让系统崩溃.
     8 //如果不想让方法抛出异常,那么我们需要自己重写这个方法
     9 -(void)setValue:(id)value forUndefinedKey:(nonnull NSString *)key
    10 {
    11     NSLog(@"是不是傻,没有还来");
    12     
    13 }
    14 //重写该方法可以输出本来对象的数据(而不再是Unicode字符编码)
    15 -(NSString *)description
    16 {
    17     return [NSString stringWithFormat:@"name = %@,sex = %@, address = %@",self.name,self.sex,self.address];
    18 }
    19 @end



  • 相关阅读:
    [前端开发]Vue组件化的思想
    [前端开发]数组中哪些方法是响应式的
    冒泡排序和选择排序
    css定位属性的运用
    JS拖拽效果的原理及实现
    Js函数的形参和实参详解
    Js中的For循环详解
    什么是盒模型?
    关于使用JS去除URL中的指定参数问题,js 对url进行某个参数的删除,并返回url
    听力的尝试
  • 原文地址:https://www.cnblogs.com/DevinSMR/p/5142888.html
Copyright © 2020-2023  润新知