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;
}