一、KVC的使用:
KVC (Key Value Coding) 键值编码 1、赋值: setValue: forKey: 赋值 setValue: forKeyPath: 多层内赋值
[p setValue:@"leo" forKey:@"name"]; [p setValue:@"wang" forKeypath:@"dog.name"];
2、取值 valueForKey: 取值 valueForKeyPath: 多层取值 NSString *name = [p valueForKey:@"name"]; NSString *dogname = [p valueForKeyPath:@"dog.name"];
3、字典转模型 (转为类的数据模型) 一般在开发中不建议使用,因为数据模型可能多层结构 Person *p2 = [Person new];
NSDictionary *dic = @{
@"name" : @"leo",
@"age" : @"33",
@"sex": @"2",
@"height": @"180",
@"dog":@{@"name": @"yuyu",
@"age": @"1"}
};
[p2 setValuesForKeysWithDictionary:dic];
4、类的成员变量数据模型转字典 NSArray *array = @[@"name",@"age",@"height"];
NSDictionary *dic2 = [p2 dictionaryWithValuesForKeys:array];
NSLog(@"----dic2=====%@",dic2);
5、取多个对象的同一属性的数据模型 NSArray *allPersons = @[p,p2];
NSArray *allPersonName = [allPersons valueForKeyPath:@"name"]
二、KVC 原理
关于KVC valueForKey:key 的调用顺序
1、getter方法: getKey(注意key首字母大写)方法 -> key方法 -> isKey方法
2、NSArray方法:countOfKey 和 objectInKeyAtIndex
3、如果没有相关方法: 看 +(BOOL) accessInstanceVariablesDirectly 返回值 (默认accessInstanceVariablesDirectly返回YES)
(1)如果是 YES 找成员变量 先后顺序 _key > _isKey > key > isKey
(2)如果是 NO 报错异常 valueForUndefinedKey