KVC:keyValue conding是一种直接通过字符串来访问类属性的机制,而不是通过setter、getter方法,当要使用core data、KVO等技术的时候KVC就是关键技术。KVC的主要作用就是给模型属性赋值
他的主要方法定义在NSKeyValueCodingprotocol:
//前两个直接传入属性名,后两个需要传入属性路径
-(void)valueForKey:(NSString *)key;
-(void)setValue:(id)value ForKey:(NSString *)key;
-(void)vlueForKeyPath:(NSString *)keyPath;
-(void)setValue:(id)value forKeyPath:(NSString *)keyPath;
KVC的底层实现原理
1、遍历字典里所有的key,假如key:name
2、查找有没有setName,直接调用setName赋值
3、假如没有setName,就会查找有没有_name属性,使得_name = value
4、假如没有_name,还会去模型中找name,如果没有找到就会报错
给NSObject写一个分类,用来判断类中是否包含某个属性,返回一个BOOL值
+ (BOOL) getVariableWithClass:(Class) myClass varName:(NSString *)name{
unsigned int outCount, i;
Ivar *ivars = class_copyIvarList(myClass, &outCount);
for (i = 0; i < outCount; i++) {
Ivar property = ivars[i];
NSString *keyName = [NSString stringWithCString:ivar_getName(property) encoding:NSUTF8StringEncoding];
keyName = [keyName stringByReplacingOccurrencesOfString:@"_" withString:@""];
if ([keyName isEqualToString:name]) {
return YES;
}
}
return NO;
}