KVC基本赋值取值方法:
setValue:forKey:假如给的key的值是name
1、去类里面找是否有一个方法叫setName:有的话执行该方法,没有的话第二步
2、去类里面找是否有个叫_name的实例变量,有赋值,没有执行第三步
3、去类里面找是否有一个叫name的实例变量,有赋值,没有执行第四步
4、查找当前类是否实现了setValue:forUnderfinedKey:方法 如果有方法内部实现,如果还没,就会抛出异常,引起崩溃。
valueForKey:假如给的key的值是name
1、去类面找是否有一个方法叫name,有的话执行该方法,没有的话第二步
2、去类里面找是否有个叫_name的实例变量,有取值,没有执行第三步
3、去类里面找是否有个叫name的实例变量,有取值,没有执行第四步
4、查找当前类是否实现了valueForKey: forUnderfineKey:方法,如果有方法内部实现,如果还没有,就会抛出异常,引起崩溃
setValuesForKeysWithDictionary:
终极有用=======================================用于数据解析 加深印象
[实例对象 setValuesForKeysWithDictionary:字典名];可以从字典从提取实例变量到类中
EQ:
[per1 setValuesForKeysWithDictionary:dic];
NSLog(@"%@",[per1 valueForKey:@"name"]);
Student *stu = [[Student alloc]init];
[stu setValuesForKeysWithDictionary:@{@"name":@"taixu",@"age":@"18",@"gender":@"m",@"major":@"iOS",@"id":@"aipao"}];
// NSLog(@"%@",stu);
NSLog(@"%@",[stu valueForKey:@"id"]);
此方法也是非常强大
/如果字典中的Key 多于模型中的实例变量是,我们可以重写此方法 内部空实现,来避免赋值不比匹配出现的崩溃问题
//如果处理特殊情况,如果字典中的KEY值是系统保留字,那么这时候赋值就会出现问题,我们可以在内部做异常处理,代码如下
-(void)setValue:(id)value forUndefinedKey:(NSString *)key{
if ([key isEqualToString:@"id"]) {
self.ID = value;
}
}
-(id)valueForUndefinedKey:(NSString *)key{
if ([key isEqualToString:@"id"]) {
return self.ID;
}
return nil;
}