美文网首页
底层原理:KVC

底层原理:KVC

作者: 飘摇的水草 | 来源:发表于2022-03-05 16:55 被阅读0次
KVC的基本用法
  • KVC的全称key - value - coding,俗称"键值编码",可以通过key来访问某个属性
  • 常见的API有:
- (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: 的区别:

  • keyPath 相当于根据路径去寻找属性,一层一层往下找
  • key 是直接拿属性的名字设置,如果按路径找会报错
KVC的基本原理

setValue:forKey:的原理

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

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

valueForKey:的原理

调用流程是:

  • 按照 getKeykeyiskey_key 的顺序依次查找方法,如果找到则直接调用
  • 如果没有找到方法,则查看accessInstanceVariablesDirectly方法的返回值
  • 如果可以访问会按照 _key_isKeykeyiskey的顺序依次查找成员变量,找到了则直接赋值
  • 如果没有找到,则报NSUnkonwKeyException错误
面试题
  • 通过KVC修改属性会触发KVO吗?
    • 会触发KVO,直接修改成员变量的值是触发不了KVO的
  • KVC的赋值

相关文章

网友评论

      本文标题:底层原理:KVC

      本文链接:https://www.haomeiwen.com/subject/sccbrrtx.html