KVC原理

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

总结

  1. 如果通过KVC给一个对象的的key赋值
  2. 首先会查找该对象是否有对应的setKey方法,如果有调用赋值
  3. 如果该对象没有实现对应的setKey方法, 继续查找_setKey方法,如果有,调用赋值。如果没有调用accessInstanceVariablesDirectly方法
  4. 如果accessInstanceVariablesDirectly方法返回的是 NO,调用- (void)setValue:(id)value forUndefinedKey:(NSString *)key
  5. 如果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 { }

总结

  1. 通过valueForKey取值
  2. 如果该对象实现对应的getKey,key,isKey,_key方法,会顺序查找方法调用取值,
  3. 如果没有找到方法调用accessInstanceVariablesDirectly方法
  4. 如果accessInstanceVariablesDirectly方法返回的是 NO,调用- (id)valueForUndefinedKey:(NSString *)key
  5. 如果accessInstanceVariablesDirectly方法返回的 YES,会按照以下顺序查找对应的成员变量
  NSString * _name;
  NSString * _isName;
  NSString * name;
  NSString * isName;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • KVC是Key Value Coding的简称。它是一种可以通过字符串的名字(key)来访问类属性的机制。而不是通...
    153037c65b0c阅读 11,765评论 15 17
  • 1. KVO 一.KVO原理的使用与证明 我们在开发的过程中经常使用KVO和KVC,但是我们并不了解其底层原理和功...
    周灬阅读 926评论 0 9
  • KVC全称是Key-Value Coding,俗称"键值编码",可以通过一个key访问某个属性. 常见的API有:...
    小心韩国人阅读 1,396评论 0 1
  • KVC定义 KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允许开发者通过Key名直...
    叶子丝阅读 688评论 0 1
  • KVC是Key Value Coding的简称。它是一种可以通过字符串的名字(key)来访问类属性的机制。而不是通...
    _李恒阅读 798评论 0 0

友情链接更多精彩内容