iOS中KVC的底层实现流程

2020-01-05  本文已影响0人  一叶知秋0830

1. KVC的使用

KVC的全称是Key-Value Coding,也就是键值编码,我们可以通过一个key来设置或获取某个属性的值。KVC所用到的API如下:

// 通过key设置属性值
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
- (void)setValue:(id)value forKey:(NSString *)key;

// 通过key获取属性值
- (id)valueForKeyPath:(NSString *)keyPath;
- (id)valueForKey:(NSString *)key; 

我们看到设置和获取属性值的方法都有2个,一个是key一个是keyPath这两个有什么区别呢?直接看下面示例吧,我们先定义如下2个类:

// Dog类
#import <Foundation/Foundation.h>
@interface Dog : NSObject

@property (nonatomic , assign) NSInteger age;

@end

// Student类
#import <Foundation/Foundation.h>
#import "Dog.h"

@interface Student : NSObject

@property (nonatomic , strong) NSString *name;
@property (nonatomic , strong) Dog *dog;

@end

如果我们要设置或获取Student实例对象的name属性值,通过keykeyPath方式都是一样的:

- (void)test{
    self.stu1 = [[Student alloc] init];
    self.stu1.dog = [[Dog alloc] init];
    
    [self.stu1 setValue:@"Jack" forKey:@"name"];
    NSLog(@"通过key的方式--%@",[self.stu1 valueForKey:@"name"]);
    
    [self.stu1 setValue:@"Bob" forKeyPath:@"name"];
    NSLog(@"通过keyPath的方式--%@",[self.stu1 valueForKeyPath:@"name"]);
}

但是如果我们要设置或获取Student实例对象的dogage属性值,那就只能通过keyPath的方式了。此时如果还是使用key的方式设置属性值的话就会抛出setValue:forUndefinedKey:的异常。

- (void)test{
    self.stu1 = [[Student alloc] init];
    self.stu1.dog = [[Dog alloc] init];
  
    [self.stu1 setValue:@5 forKeyPath:@"dog.age"];
    NSLog(@"%@",[self.stu1 valueForKeyPath:@"dog.age"]);
}

2 KVC设置属性值的流程

我们以setValue:forKey:为例,KVC设置属性值的整个流程如下图所示:

KVC设置属性值的流程
比如我们执行[self.stu1 setValue:@"Jack" forKey:@"name"];这句代码,其底层执行流程如下:

3 KVC获取属性值的流程

KVC获取属性值的流程图如下:

KVC获取属性值的流程

比如我们执行[self.stu1 valueForKey:@"name"];这句代码,其底层执行流程如下:

上一篇 下一篇

猜你喜欢

热点阅读