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



原文地址:https://www.cnblogs.com/DevinSMR/p/5142888.html