一. KVC

KVC也就是key-value-coding,即键值编码,最常见的两种用法就是:

1). 对私有变量进行赋值,同样的也可以通过它进行取值

  1. 对某一个属性进行赋值,可以不用加下划线,它的查找规则应该是:先查找和直接写入的字符串相同的成员变量,如果找不到就找以下划线开头的成员变量;
[p setValue:@170 forKey:@"height"];
[p valueForKey:@"height"];
  1. forKeyPath是包含了 forKey这个方法的功能的,甚至 forKeyPath方法还有它自己的高级的功能。所以我们在使用kvc的时候,最好用 forKeyPath这个方法。
[p setValue:@200 forKey:@"dog.weight"]; // 报错
[p setValue:@200 forKeyPath:@"dog.weight"]; // 会先去找有没有dog这个key,然后去找dog有没有weight这个属性

2). 字典转模型

简单使用:

  obj.name=dic[@"name"];obj.sex=dic[@"sex"];obj.age=dic[@"age"];

将以上代码替换为一行代码

 [obj setValuesForKeysWithDictionary:dic];
  1. 字典转模型的时候,字典中的某一个key一定要在模型中有对应的属性,否则会导致程序崩溃;
    解决方式:实现一个方法setValue:forUndefinedKey: 这个方法能过滤掉不存在的键值。建议都加上此方法,避免服务器修改了接口后,App因没法及时更新导致程序崩溃
// 在model的h文件中添加:
-(void)setValue:(id)value forUndefinedKey:(NSString *)key;
// 在m文件中实现:
// 并不需要在方法中写任何内容
-(void)setValue:(id)value forUndefinedKey:(NSString *)key{
}
  1. 如果model里面的有不存在于dic中的元素会怎样?
    答案是没有问题,对应的属性值是空的
  2. 如果dic中的key与model中的变量名字不同,应该怎么赋值?
    答案也是从setValue:forUndefinedKey方法入手, 完善model中的setValue:forUndefinedKey方法
    -(void)setValue:(id)value forUndefinedKey:(NSString *)key{if([key isEqualToString:@"username"]){self.name=value;}}
  1. 如果一个模型中包含了另外的模型对象,是不能直接转化成功的;

二. KVO

KVO,即key-value-observing,利用一个key来找到某个属性并监听其值得改变。其实这也是一种典型的观察者模式。
简单的说,kvo的用法非常简单。

  1. 添加观察者
  2. 在观察者中实现监听方法,observeValueForKeyPath: ofObject: change: context:(通过查阅文档可以知道,绝大多数对象都有这个方法,因为这个方法属于NSObject)
  3. 移除观察者

KVO的底层实现
当一个类的属性被观察的时候,系统会通过runtime动态的创建一个该类的派生类,并且会在这个类中重写基类被观察的属性的setter方法,而且系统将这个类的isa指针指向了派生类,从而实现了给监听的属性赋值时调用的是派生类的setter方法。重写的setter方法会在调用原setter方法前后,通知观察对象值得改变。

1. 如何手动触发KVO?
答: 被监听的属性的值被修改时,就会自动触发KVO。如果想要手动触发KVO,则需要我们自己调用willChangeValueForKey和didChangeValueForKey方法即可在不改变属性值的情况下手动触发KVO,并且这两个方法缺一不可。

2. 直接修改成员变量会触发KVO吗?
答:不会触发

3. 通过KVC修改属性会触发KVO么?
答:会触发

参考:

  1. KVC和KVO

iOS KVC和KVO相关推荐

  1. iOS KVC和KVO简介

    kvc KVC,即是指 NSKeyValueCoding,一个非正式的 Protocol,它是一种可以直接通过字符串的名字(key)来访问类属性的机制(一种间接访问对象的属性的机制). 常见的 获取值 ...

  2. iOS 中KVC、KVO、NSNotification、delegate 总结及区别

    iOS 中KVC.KVO.NSNotification.delegate 总结及区别 1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属 ...

  3. Ios KVC KVO

    一.KVC与KVO *"KVC":key value Coding(键值编码) *目的:间接的修改或获取对象的属性,降低程序(类与类)之间的耦合度. *"KVO" ...

  4. ios 通过kvc修改属性会触发kvo_iOS开发-KVC和KVO的理解

    KVC和KVO看起来很专业,其实用起来还是比较简单的,KVC(Key-value coding)可以理解为键值对编码,如果对象的基本类型,那么键值对编码实际上和get,set方法没有区别,如果是属性是 ...

  5. 【iOS】—— KVC与KVO

    KVC与KVO 一.KVC 1.简单介绍 2.常见的API 3.key和keyPath的区别 4.KVC原理 4.1 `setValue:forKey: `的原理(KVC赋值原理) 4.2 `valu ...

  6. 【iOS】KVC 与 KVO

    一.KVC与KVO *"KVC":key value Coding(键值编码) *目的:间接的修改或获取对象的属性,降低程序(类与类)之间的耦合度. *"KVO" ...

  7. ios中的KVC和KVO

    最近研究了一下子KVC和KVO,KVC:即Key-Value-Coding 而KVO:即Key-Value-Observer KVC是针对NSObject的子类,因为它的实现是由于其括展类NSObje ...

  8. Objective-C中的KVC与KVO(上)

    本文转载 李朴之先生博客 http://blog.csdn.net/pucker/article/details/7413280 Objective-C中的KVC与KVO是两种比较重要的技术,这里简要 ...

  9. apple开发者文档关于KVC和KVO文档的一些渣翻——这里是原地址

    apple开发者文档关于KVC和KVO文档的一些渣翻--这里是原地址 Key-Value Coding Programming Guide KVC编程介绍 介绍 本文档用来描述NSKeyValueCo ...

最新文章

  1. vue+ivew-admin开发项目,内存占用过大解决办法
  2. Linux 计划任务 访问网页
  3. 自动识别文字的编码以及读取所有文本——VB2005
  4. HTML5 的知识分享(二):HTML5 的常用标签
  5. windows中安装zookeeper
  6. java 输入流关闭顺序_Java IO流中先关闭输出流还是先关闭输入流?为什么?
  7. php csv转excel 双引号,PHP高效导出Excel(CSV)
  8. 怒肝 8 个月源码,我成为了 Spring 开源贡献者
  9. 获取计算机最大磁盘,Qt获取电脑磁盘容量(示例代码)
  10. WordPress主题-Real Estate 7–房地产[更至v3.1.0]
  11. 离开APM的弹性云还是真弹性吗
  12. 认识下这位全能型漏洞猎人
  13. centos6.5搭建vsftp服务器
  14. 解决在Mac上操作sourcetree反复要求输入密码的问题
  15. python 数组学习
  16. hbase 二进制数据写入_HBase总结
  17. 深度学习系列43:引入注意力的SAGAN/BigGAN和big_sleep
  18. 前剪枝算法和后剪枝算法区别
  19. STM8开发环境搭建(STVD + COSMIC)
  20. 制度决定成败:揭秘思科顶层设计的秘密

热门文章

  1. pythonrequests请求https错误_如何解决python之requests安全证书(HTTPS请求)问题?
  2. android 监控行为,一种针对Android系统App行为的监控方法
  3. 大疆aeb连拍_不适合航拍?不如深度发掘大疆spark拍照功能
  4. 这次的PION的总结
  5. 日语动词里的未然形、连用形、终止形、连体形、假定形、命令形、推量形各代表的意思
  6. 2008年GCT考试真题A卷
  7. 原生threeJS入门
  8. DM数据库部署dem管理工具(tomcat)
  9. 修改/忘记数据库密码
  10. 导致网页图片字体模糊的原因