关于KVC分析总结笔记

KVC基础理解

KVC全称Key-Value-Coding俗称键值编码,可以通过一个key访问某个属性
API:

- (void)setValue:(nullable id)value forKey:(NSString *)key;
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
- (nullable id)valueForKey:(NSString *)key;
- (nullable id)valueForKeyPath:(NSString *)keyPath;

通过如下示例使用:

GYPerson *person = [[GYPerson alloc] init];
[person setValue:@(2) forKey:@"age"];
NSLog(@"%ld", (long)person.age);

KVC :setValue:forKey:的原理

关于KVC分析总结笔记_第1张图片
图1.jpg

根据示例图,我们可以观察到,如果存在 setValue:_setValue,就正常传递参数,设置值。
一、同时存在 setValue:_setValue,优先调用setAge:(NSInteger)age;
关于KVC分析总结笔记_第2张图片
图2.jpg

二、不存在 setValue,则调用_setAge:(NSInteger)age;
关于KVC分析总结笔记_第3张图片
图3.jpg

三、如果不允许直接访问成员变量,直接报错
关于KVC分析总结笔记_第4张图片
图4.jpg

四、默认允许访问成员变量,不存在 setValue:_setValue方法时,他会按顺序查找 _key, _isKey, key, isKey。我们在 GYPerson.h中定义相关成员变量。

@interface GYPerson : NSObject {
    NSInteger _age;
    NSInteger _isAge;
    NSInteger age;
    NSInteger isAge;
}
@end

关于KVC分析总结笔记_第5张图片
图5.jpg

优先向 _key赋值,其它以此类推可验证。

valueForKey:原理

会触发

关于KVC分析总结笔记_第6张图片
图6.jpg

验证可与 setValue:forKey:的原理一致

通过KVC修改属性是否会触发KVO

关于KVC分析总结笔记_第7张图片
图7.jpg

你可能感兴趣的:(关于KVC分析总结笔记)