KVC中的setValuesForKeysWithDictionary

KVC中的setValuesForKeysWithDictionary_第1张图片
图片来自500px

文 || 張贺

  • setValuesForKeysWithDictionary的底层实现:
    遍历字典中的所有Key,去模型中查找有没有对应的属性名,如果就给这个属性赋值。

    + (instancetype)flagWithDict:(NSDictionary *)dict
    {
      Flag *flag = [[self alloc] init];
    // [flag setValuesForKeysWithDictionary:dict];
    // KVC
    // setValuesForKeysWithDictionary底层实现:
    // 遍历字典中的所有Key,去模型中查找有没有对应的属性名,如果就给这个属性赋值
      [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
    // 给模型的key属性名赋值value
        [flag setValue:obj forKey:key];
       }];
      return flag;
    }
    

[flag setValue:obj forKey:key]; 也是一个KVC。

  • setValue:forKey: 底层实现:(字典中有icon:touxiang.jpg)
    1.首先去模型中查找有没有setIcon方法,如果有,就直接调用 [flag setIcon:@"touxiang.jpg"]
    2.继续去模型中查找有没有icon属性,如果有,就直接访问成员属性 icon = @"touxiang.jpg"
    3.继续去模型中查找有没有_icon属性,如果有,就直接访问成员属性 _icon = @"touxiang.jpg"
    4.找不到,就直接报错. [flag setValue:forUndefinedKey:]
  • setValuesForKeysWithDictionary报错:
    如果字典中存在模型里没有的key,程序就会崩溃:


    Snip20160802_1.png

    解决办法是在模型中实现
    -(void)setValue:(id)value forUndefinedKey:(NSString *)key{
    }


2016.8.2

你可能感兴趣的:(KVC中的setValuesForKeysWithDictionary)