关于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:的原理

图1.jpg

根据示例图,我们可以观察到,如果存在setValue:_setValue,就正常传递参数,设置值。
一、同时存在setValue:_setValue,优先调用setAge:(NSInteger)age;
图2.jpg

二、不存在setValue,则调用_setAge:(NSInteger)age;
图3.jpg

三、如果不允许直接访问成员变量,直接报错
图4.jpg

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

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

图5.jpg

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

valueForKey:原理

会触发

图6.jpg

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

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

图7.jpg
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • KVC KVC定义 KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允许开发者通过K...
    暮年古稀ZC阅读 2,164评论 2 9
  • KVC(Key-value coding)键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iO...
    我的梦工厂阅读 901评论 1 8
  • KVC/KVO 概念 KVC : 即 Key-Value-Coding,用于键值编码。作为 cocoa 的一个标准...
    满脸胡茬的小码农阅读 1,978评论 2 8
  • KVC(Key-valuecoding)键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iOS...
    榕樹頭阅读 723评论 0 2
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,135评论 1 32