kvc,就是key value coding(键值编码)
KVC的操作方法由NSKeyValueCoding协议提供,而NSObject就实现了这个协议,也就是说ObjC中几乎所有的对象都支持KVC操作,常用的KVC操作方法如下:
- 动态设置: setValue:属性值 forKey:属性名(用于简单路径)、setValue:属性值 forKeyPath:属性路径(用于复合路径,例如Person有一个Book类型的属性,那么person.Book就是一个复合属性)
- 动态读取: valueForKey:属性名 、valueForKeyPath:属性名(用于复合路径)
下面通过一个例子来理解KVC
Book *book = [[Book alloc] init];book.name = @"葵花宝典";
Person *person = [[Person alloc] init];
person.name = @"Jack";
person.age = 5;
person.book = book;
NSString *pName = [person valueForKey:@"name"];
NSLog(@"%@", pName);//输出结果是jack
NSString *bName = [person valueForKeyPath:@"book.name"];
NSLog(@"%@", bName);//输出结果是葵花宝典
NSString *bName1 = [person.book valueForKeyPath:@"name"];
NSLog(@"%@", bName1);//输出结果是葵花宝典
Person *p = [[Person alloc] init];
p.name = @"Jack";
p.age = 10;
Person *p1 = [[Person alloc] init];
p1.name = @"Rose";
p1.age = 40;
Person *p2 = [[Person alloc] init];
p2.name = @"Jim";
p2.age = 19;
NSArray *persons = @[p, p1, p2];
// 取出persons数组中所有person对象的name属性值
NSArray *names = [persons valueForKeyPath:@"name"];
NSLog(@"%@", names);//输出结果是jack,rose,jim
[p setValue:@"Jack" forKeyPath:@"name"];
[p setValue:@"50" forKeyPath:@"age"];
NSString *name = [p valueForKeyPath:@"name"];
int age = [[p valueForKeyPath:@"age"] intValue];
NSDictionary *dict = [p dictionaryWithValuesForKeys:@[@"name"]];
NSLog(@"-------%@", dict);