底层原理:KVC

2022-03-05  本文已影响0人  飘摇的水草
KVC的基本用法
- (void)setValue:(id)value forKey:(NSString *)key;
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;

- (id)valueForKey:(NSString *)key; 
- (id)valueForKeyPath:(NSString *)keyPath;

代码演示如下,先创建两个类:PersonCat

#import <Foundation/Foundation.h>

@interface Cat : NSObject
@property (nonatomic, assign) int weight;
@end

@interface Person : NSObject
@property (nonatomic, assign) int age;
@property (nonatomic, strong) Cat *cat;
@end

- (void)viewDidLoad {
    [super viewDidLoad];
    Person *person = [[Person alloc]init];
    person.cat = [[Cat alloc]init];
    [person setValue:@20 forKey:@"age"];
    [person setValue:@20 forKeyPath:@"cat.weight"];
    NSLog(@"%d",person.age);
    NSLog(@"%d",person.cat.weight);
    NSLog(@"%@",[person valueForKey:@"age"]);
    NSLog(@"%@",[person valueForKeyPath:@"cat.weight"]);
}

setValue:forKeyPath:setValue: forKey: 的区别:

KVC的基本原理

setValue:forKey:的原理

当我们设置setValue:forKey:时,内部的调用流程是:

  1. 首先会依次查找是否存在 setKey:_setKey 方法,如果有则直接调用
  2. 如果没有,则查看accessInstanceVariablesDirectly方法的返回值,这个方法表示是否可以直接访问成员变量,默认值是YES,如果可以,则会按照_key_isKeykeyiskey的顺序查找成员变量,如果找到了则直接赋值
  3. 如果没有找到,则调用setValue:forUndefinedKey:方法并抛出NSUnknowKeyException异常

valueForKey:的原理

调用流程是:

面试题
上一篇 下一篇

猜你喜欢

热点阅读