IOS的KVC

KVC作用

KVC类似于java中的反射,它是通过一个字符串 key 来获取和设置对应类中成员属性的值
而key就是用来遍历某一个类,去查找类内部是否有与key同名的成员属性

所以对于KVC来说,成员属性无私有 共有之分,只要在类中,只要能找到相对应的就可以设置值

作用:
1. 给私有的成员属性赋值
2. 系统底层的给成员属性赋值都是采用KVC

 

 

演示代码

  1 #import <Foundation/Foundation.h>
  2 #import "Person.h"
  3 int main(int argc, const char * argv[]) {
  4     @autoreleasepool {
  5        
  6 //        // 直接为对象的属性赋值
  7 //        Person *p1 = [[Person alloc] init];
  8 //        p1.name = @"张三";
  9 //        
 10 //        Dog *chihuahua = [[Dog alloc] init];
 11 //        chihuahua.name = @"吉娃娃";
 12 //        p1.dog = chihuahua;
 13 //        
 14 //        //NSLog(@"%@ --- %@", p1.name, p1.dog.name);
 15 //        
 16 //        
 17 //        
 18 //        
 19 //        // 通过kvc的方式为对象赋值
 20 //        Dog *husky = [[Dog alloc] init];
 21 //        husky.name = @"哈士奇";
 22 //        
 23 //        
 24 //        [p1 setValue:@"李四" forKeyPath:@"name"];
 25 //        [p1 setValue:@10 forKeyPath:@"age"];
 26 //        [p1 setValue:husky forKeyPath:@"dog"];
 27 //        
 28 //        
 29 //        NSLog(@"%@---%d", p1.name, p1.age);
 30 //        NSLog(@"%@", p1.dog.name);
 31         
 32         
 33 //        //-----------------------------------
 34 //        Person *p1 = [[Person alloc] init];
 35 //        
 36 //        NSString *value = @"husky@yahoo.com";
 37 //        
 38 //        NSString *property = @"email";
 39 //        
 40 //        
 41 //        [p1 setValue:value forKeyPath:property];
 42 //        
 43 //        NSLog(@"%@", p1.name);
 44 //    
 45 //        NSLog(@"%@", p1.email);
 46         
 47         
 48         //------------------------------
 49 //        Person *p1 = [[Person alloc] init];
 50 //        Dog *d = [[Dog alloc] init];
 51 //        
 52 //        [p1 setValue:@"rzc" forKeyPath:@"name"];
 53 //        [p1 setValue:@"rzc@yahoo.com" forKeyPath:@"email"];
 54 //         [p1 setValue:@18 forKeyPath:@"age"];
 55 //        [p1 setValue:d forKeyPath:@"dog"];
 56 //        
 57 //        // @"dog.name" 这个就叫做keyPath 或者叫 "属性的路径"
 58 //        [p1 setValue:@"哈士猫" forKeyPath:@"dog.name"];
 59 //         NSLog(@"%@---%d---%@--%@",p1.name,p1.age, p1.email, p1.dog.name);
 60         
 61         
 62 //        NSDictionary *bz = @{
 63 //                             @"name" : @"任智超",
 64 //                             @"age" : @28,
 65 //                             @"email" : @"rzc0714@163.com",
 66 //                             @"dog" : @{@"name" : @"加肥猫"}
 67 //                             };
 68 //        
 69 //        [p1 setValuesForKeysWithDictionary:bz];
 70 //        NSDictionary *dogDict = (NSDictionary *)p1.dog;
 71 //        NSLog(@"%@---%d---%@--%@",p1.name,p1.age, p1.email, dogDict[@"name"]);
 72         
 73         
 74         
 75         //---------------------------------------------------
 76 //        Person *p1 = [[Person alloc] init];
 77 //        p1.name = @"张三";
 78 //        
 79 //        Dog *chihuahua = [[Dog alloc] init];
 80 //        chihuahua.name = @"吉娃娃";
 81 //        p1.dog = chihuahua;
 82 //        
 83 //        NSString *name = [p1 valueForKeyPath:@"name"];
 84 //        NSString *dogName = [p1 valueForKeyPath:@"dog.name"];
 85 //        
 86 //        NSLog(@"%@----%@", name, dogName);
 87         
 88         
 89         
 90         //------------把对象转成字典---------------------------------------
 91         Person *p1 = [[Person alloc] init];
 92         p1.name = @"张三";
 93         p1.age = 15;
 94         p1.email = @"zs@yahoo.com";
 95         
 96         Dog *chihuahua = [[Dog alloc] init];
 97         chihuahua.name = @"吉娃娃";
 98         p1.dog = chihuahua;
 99         
100         // 把对象转成字典
101         NSDictionary *dict = [p1 dictionaryWithValuesForKeys:@[@"name", @"age", @"email", @"dog"]];
102 
103         NSLog(@"%@", dict);
104         
105         NSLog(@"%@", [dict[@"dog"] class]);
106         NSLog(@"%@", [dict[@"dog"] name]);
107         
108         
109         
110     }
111     return 0;
112 }

 

posted @ 2015-05-27 22:21  王世桢  阅读(192)  评论(0编辑  收藏  举报