KVC赋值原理
调用方式
Person *person = [[Person alloc] init];
[person setValue:@"abc" forKey:@"name"];
逻辑处理
#import "Person.h"
@interface Person() {
//声明成员变量_name;
NSString * _name;
NSString * _isName;
NSString * name;
NSString * isName;
}
@end
@implementation Person
//如果该对象声明了setName方法,默认调用该方法
- (void)setName:(NSString *)name {
_name = name;
}
//如果该对象未声明_setName方法,默认调用_setName方法
- (void)_setName:(NSString *)name {
_name = name;
}
//如果对象即没有声明setName也没有声明_setName,会调用accessInstanceVariablesDirectly
+ (BOOL)accessInstanceVariablesDirectly {
return YES;
}
//accessInstanceVariablesDirectly返回的是NO调用该方法
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
NSLog(@"找不到对应的key");
}
@end
总结
- 如果通过KVC给一个对象的的key赋值
- 首先会查找该对象是否有对应的setKey方法,如果有调用赋值
- 如果该对象没有实现对应的setKey方法, 继续查找_setKey方法,如果有,调用赋值。如果没有调用accessInstanceVariablesDirectly方法
- 如果accessInstanceVariablesDirectly方法返回的是 NO,调用- (void)setValue:(id)value forUndefinedKey:(NSString *)key
- 如果accessInstanceVariablesDirectly方法返回的 YES,会按照以下顺序查找对应的成员变量赋值
NSString * _name;
NSString * _isName;
NSString * name;
NSString * isName;
如果找到以上对应的成员变量,会调用- (void)setValue:(id)value forUndefinedKey:(NSString *)key方法
KVC取值原理
调用方式
NSString*name = [person valueForKey:@"name"];
NSLog(@"%@",name);
逻辑处理
- (NSString *)getName { }
- (NSString *)name { }
- (NSString *)isName { }
- (NSString *)_name { }
总结
- 通过valueForKey取值
- 如果该对象实现对应的getKey,key,isKey,_key方法,会顺序查找方法调用取值,
- 如果没有找到方法调用accessInstanceVariablesDirectly方法
- 如果accessInstanceVariablesDirectly方法返回的是 NO,调用- (id)valueForUndefinedKey:(NSString *)key
- 如果accessInstanceVariablesDirectly方法返回的 YES,会按照以下顺序查找对应的成员变量
NSString * _name;
NSString * _isName;
NSString * name;
NSString * isName;