KVC简述:

KVC相信大家再熟悉不过了,键值编码,可以解决很多问题,包括视图上的给UITextField占位文字颜色大小进行设置,获取系统视图进行其颜色样式的自定义,模型转换等等,很多地方可以用KVC,接下来我们就深度解析总结一下KVC。 在iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值。而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性。而不是在编译时确定,这也是iOS开发中的黑魔法之一。

KVC的使用

四个重要的方法:

- (nullable id)valueForKey:(NSString *)key;                          //直接通过Key来取值
- (void)setValue:(nullable id)value forKey:(NSString *)key;          //通过Key来设值
- (nullable id)valueForKeyPath:(NSString *)keyPath;                  //通过KeyPath来取值
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;  //通过KeyPath来设值

简单的使用示例:
只有一层的:

#import "ViewController.h"@interface ViewController ()
{NSString *address;  //成员变量
}@property (nonatomic, copy) NSString *name;  //属性@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];//为属性赋值与取值[self setValue:@"hui" forKey:@"name"];  //设置值NSString *name = [self valueForKey:@"name"];  //获取值NSLog(@"%@", name);//为成员变量赋值与取值[self setValue:@"Xiamen" forKey:@"address"];  //设置值NSString *address = [self valueForKey:@"address"];  //获取值NSLog(@"%@", address);
}@end

多层(KeyPath):

#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface Person : NSObject@property (nonatomic, copy) NSString *name;@endNS_ASSUME_NONNULL_END#import "Person.h"@implementation Person@end
#import "ViewController.h"
#import "Person.h"@interface ViewController ()@property (nonatomic, strong) Person *person;@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];self.person = [[Person alloc] init];//为Preson的name属性赋值与取值(KeyPath)[self setValue:@"hui" forKeyPath:@"person.name"];NSString *name = [self valueForKeyPath:@"person.name"];NSLog(@"%@", name);
}@end

valueForKey:底层原理


原理如下:

  1. 先找相关方法 set:,_set:,setIs:,如果有,优先调用setter方法完成赋值(注意:set后面的键的第一字字母必须是大写!!)
  2. 如没有找到相关方法 + (BOOL)accessInstanceVariablesDirectly,判断是否可以直接方法成员变量
  3. 如果判断是NO,直接执行KVC的setValue:forUndefinedKey:(系统抛出异常,未定义key)
  4. 如果判断是YES,继续找相关的_,_is,,is
    方法或成员 都不存在,setValue:forUndefinedKey:方法,默认抛出异常

【iOS开发】—— KVC相关推荐

  1. iOS 高级开发 KVC(一),ios开发kvc

    http://www.bkjia.com/IOSjc/989396.html 熟练使用KVC 可以再开发过程中可以给我们带来巨大的好处,尤其是在json 转模型的时候,KVC让程序员摆脱了繁琐无营养的 ...

  2. iOS开发-观察者模式

    观察者模式也被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己.观察者模式中 ...

  3. iOS开发面试攻略(KVO、KVC、多线程、锁、runloop、计时器)

    KVO & KVC KVO用法和底层原理 使用方法:添加观察者,然后怎样实现监听的代理 KVO底层使用了 isa-swizling的技术. OC中每个对象/类都有isa指针, isa 表示这个 ...

  4. iOS开发系列--让你的应用“动”起来

    概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画 ...

  5. iOS开发-由浅至深学习block

    作者:Sindri的小巢(简书) 关于block 在iOS 4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调.这不免让我们想到在C函数中,我们 ...

  6. iOS开发-面试总结(九)

    iOS面试指导 一 经过本人最近的面试和对面试资料的一些汇总,准备记录这些面试题,以便ios开发工程师找工作复习之用,本人希望有面试经验的同学能和我同时完成这个模块,先出面试题,然后会放出答案. 1. ...

  7. iOS开发UI篇—实现UITableview控件数据刷新

    iOS开发UI篇-实现UITableview控件数据刷新 一.项目文件结构和plist文件 二.实现效果 1.说明:这是一个英雄展示界面,点击选中行,可以修改改行英雄的名称(完成数据刷新的操作). 运 ...

  8. iOS开发之让你的应用“动”起来转写

    在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画.动画 ...

  9. iOS开发UI篇—CALayer简介

    iOS开发UI篇-CALayer简介 一.简单介绍 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. 其实UI ...

最新文章

  1. pymysql.err.IntegrityError: (1062, Duplicate entry 'roxml-ROXML' for key 'PRIMARY')
  2. Qt 有层级关系的qss样式,使用id定位到具体控件
  3. linux信号值头文件位置,Linux C 信号处理机制
  4. 代码质量检测平台架构设计
  5. springcloud灰度发布实现方案
  6. J2EE的十三个技术规范
  7. 考试一个程序员,1f=0.1
  8. origin刻度消失_使用Origin制作XRD图基本技巧,你get到了嘛?
  9. head first设计模式之设计原则
  10. 《流畅的Python第二版》读书笔记——Python数据模型
  11. 圆周率一千万亿位_圆周率2700万亿位完整版?
  12. 汉字录入到计算机的过程,如何快速把书中文字录入到电脑中
  13. 信息通信类部分中文期刊投稿心得(转帖)
  14. dn什么意思_给排水DN与dn分别是什么
  15. Java中的增强for
  16. C# WPF 3DTools下的TrackballDecorator清除view,出现Null异常
  17. 微信授权登录基本流程(网站应用)
  18. lombok get/set 方法未生效,解决办法
  19. ADC—应用交付-AX系列
  20. 我的世界服务器信号下面是红,适用于服务器的红石抽奖机我的世界抽奖机电路图...

热门文章

  1. 腾讯千帆河洛上新日事清、微伴、新榜、腾讯企点、纷享销客、聚合数据、NPSMeter
  2. 独行月球:沈腾版云天明起承转合破中庸 | 真北影评
  3. Android计步器悦步——百度地图
  4. Cocos Creator JSB绑定
  5. WordPress入门【四、主题】
  6. 使用Qt实现截图功能
  7. 开源一个各种USB电缆的测试仪,再也不用担心被只有充电功能的数据线坑了
  8. IOS的.m和.mm文件总结
  9. 学EE做硬件找工作不如学CS做软件,为什么会这样?
  10. python小练习之航空公司数据练习题(二)