iOS开发技巧

OC底层原理17—KVC底层原理

2020-11-02  本文已影响0人  夏天的枫_

KVC

KVC(Key Value Coding)是定义在NSKeyValueCoding.h文件中的一个非正式协议。KVC提供了一种可以间接访问其属性方法或成员变量的机制,可以通过字符串来访问对应的属性方法或成员变量。

常用API

设值与取值

常用到的设值与取值的几种方式:

// 通过Key来取值
- (nullable id)valueForKey:(NSString *)key;
- (void)setValue:(nullable id)value forKey:(NSString *)key;

// 通过KeyPath(也称路由)来取值
- (nullable id)valueForKeyPath:(NSString *)keyPath; 
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;  
KeyPath

使用示例入

    [myAcount setValue:@"xiaoxiao" forKeyPath:@"model.name"]; // 可以通过 . 的形式获取到更深层的属性  
    NSLog(@"%@",[myAcount valueForKeyPath:@"model.name"]);
字典操作
- (void)dictionaryTest{
    NSDictionary* dict = @{
                           @"name":@"xiaoxiao",
                           @"age":@18,
                           };
    PeasonModel  *p = [[PeasonModel alloc] init];
    // 字典转模型
    [p setValuesForKeysWithDictionary:dict];
    NSLog(@"%@",p);
    // 键数组转模型到字典
    NSArray *array = @[@"name",@"age"];
    NSDictionary *dic = [p dictionaryWithValuesForKeys:array];
    NSLog(@"%@",dic);
}
其他常用方法
//默认返回YES,表示如果没有找到Set<Key>方法的话,会按照_key,_iskey,key,iskey的顺序搜索成员,设置成NO就不这样搜索
+ (BOOL)accessInstanceVariablesDirectly;

//KVC提供属性值正确性验证的API,它可以用来检查set的值是否正确、为不正确的值做一个替换值或者拒绝设置新值并返回错误原因。
- (BOOL)validateValue:(inout id __nullable * __nonnull)ioValue forKey:(NSString *)inKey error:(out NSError **)outError;

//这是集合操作的API,里面还有一系列这样的API,如果属性是一个NSMutableArray,那么可以用这个方法来返回。
- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key;

//如果Key不存在,且KVC无法搜索到任何和Key有关的字段或者属性,则会调用这个方法,默认是抛出异常。
- (nullable id)valueForUndefinedKey:(NSString *)key;

//和上一个方法一样,但这个方法是设值。
- (void)setValue:(nullable id)value forUndefinedKey:(NSString *)key;

//如果你在SetValue方法时面给Value传nil,则会调用这个方法
- (void)setNilValueForKey:(NSString *)key;

//输入一组key,返回该组key对应的Value,再转成字典返回,用于将Model转到字典。
- (NSDictionary<NSString *, id> *)dictionaryWithValuesForKeys:(NSArray<NSString *> *)keys;

设值&取值过程

1.设值

常用设值方法就是setValue:forKey,其底层原理是怎么样的呢?开发过程中,我们可能曾经试着Jump to Definition去查看底层实现,然后只有注释,Foundation闭源的。想要窥探其底层,可能需要其他手段:1.通过苹果官方文档;2.Github搜相关的工程;3.通过Hopper反汇编,通过伪代码去理解;

官网Key-Value Coding
在官网中找到了以下关于setValue:forkey的解释

setValue:forkey

执行流程是:

整理得到流程图更方便理解


setValue:forKey: 流程
2.取值

当然也就找到了valueForKey:的解释

取值-valueForKey 逻辑

流程是:

整理得到流程图:


valueForKey: 取值流程

KVC应用场景

// 字典转模型
- (void)setValuesForKeysWithDictionary:(NSDictionary<NSString *, id> *)keyedValues;
// 模型转字典
- (NSDictionary<NSString *, id> *)dictionaryWithValuesForKeys:(NSArray<NSString *> *)keys;
上一篇 下一篇

猜你喜欢

热点阅读