KVC的使用和原理

155 阅读1分钟

一、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