11. KVC And KVO
1. KVC And KVO 的认识
KVC/KVO是观察者模式的一种实现 KVC全称是Key-value coding,翻译成键值编码。顾名思义,在某种程度上跟map的关系匪浅。它提供了一种使用字符串而不是访问器方法去访问一个对象实例变量的机制。KVO全称是Key-value observing,翻译成键值观察。提供了一种当其它对象属性被修改的时候能通知当前对象的机制。再MVC大行其道的Cocoa中,KVO机制很适合实现model和controller类之间的通讯。
2. KVC And KVO 的使用
首先我们创建一个Egg类,给它赋值一个属性
@interface Egg : NSObject
@property (nonatomic ,copy)NSString *weight;
@end
@implementation Egg
@end
然后我们在创建一个JianBingGuoZi类 (名字随便起的),给它设置几个属性,其中一个是刚才我们定义的Egg
#import "Egg.h"
@interface JianBingGuoZi : NSObject
@property (nonatomic, strong)Egg *egg;
@property (nonatomic, copy)NSString *name;
@property (nonatomic, assign) int price;
@property (nonatomic, copy)NSString *decr;
@end
@implementation JianBingGuoZi
@end
在程序启动的跟视图
- (void)viewDidLoad {
[super viewDidLoad];
_egg = [[Egg alloc] init];
_egg.weight = @"80克";
_jian = [[JianBingGuoZi alloc] init];
_jian.name = @"水果馅的煎饼";
_jian.price = 5;
_jian.egg = _egg;
// 1. 使用KVC获取数据
[self useKVCGetData];
// 2. 使用KVC批处理数据
[self usePiChuLi];
// 3. 链性访问
[self useKeyPath];
// 4. KVO的使用
[self useKVO];
}
- (void)useKVO
{
// 给一个对象添加监听
// 1. 谁去监听
// 2. 监听那个属性
// 3. 监听到对象属性改变的时候传递数据是什么数据
[_jian addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
}
// 监听的对象 如果属性发生变化就会调用这个方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"%@---%@",change[@"new"],change[@"old"]);
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[_jian setValue:@"狗肉馅的煎饼" forKeyPath:@"name"];
[_jian setValue:@"这是一个煎饼,不是饺子" forUndefinedKey:@"description"];
}
- (void)useKeyPath
{
// 设置属性值
[_jian setValue:@"200克" forKeyPath:@"egg.weight"];
// 获取属性值
[_jian valueForKeyPath:@"egg.weight"];
}
- (void)usePiChuLi
{
// 1. 同时获取对象的多个属性
NSArray *array = [NSArray arrayWithObjects:@"name",@"price", nil];
NSDictionary *dict = [_jian dictionaryWithValuesForKeys:array];
// 2. 同时给对象的多个属性赋值
NSDictionary *dictT = @{
@"name":@"老鼠肉馅的煎饼",
@"price":[NSNumber numberWithInt:15]
};
[_jian setValuesForKeysWithDictionary:dictT];
}
- (void)useKVCGetData
{
// 1.valueForKey 首先查找以name或者isName命名的getter方法,如果没有这个方法,去对象内部查找名字为name或者_name命名的实例变量
NSString *name = [_jian valueForKey:@"name"];
// 2. KVC 自动包装功能,自动将基本数据类型包装成NSNumber 或者 NSValue 对象
[_jian valueForKey:@"price"];
// 设置属性值 首先查找以setName命名的setter方法,如果没有这个方法,去对象内部查找名字为name或者_name命名的实例变量
[_jian setValue:@"猪肉馅的煎饼" forKey:@"name"];
}
- (void)dealloc
{
// 移除监听
[_jian removeObserver:self forKeyPath:@"name"];
}
@end
3. 拓展
有时候后台给我们传过来的参数包含有关键字,我们在赋值的时候会出错,比如

但是我们又不能让后台去改返回的数据,这时候我们就可以这么写,把属性名字更改

然后再重写这个方法就行了

11. KVC And KVO的更多相关文章
- KVC 与 KVO 理解
KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一 ...
- KVC和KVO的区别
kvc和kvo 1.kvc Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一个非正式的 Protocol,提供一种机制来间接访问对象的属性.KVO 就 ...
- 聊聊 KVC 和 KVO 的高阶应用
KVC, KVO 作为一种魔法贯穿日常Cocoa开发,笔者原先是准备写一篇对其的全面总结,可网络上对其的表面介绍已经够多了,除去基本层面的使用,笔者跟大家谈下平常在网络上没有提及的KVC, KVO进阶 ...
- KVC 与 KVO 理解-b
KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一 ...
- KVC和KVO
OC中的一个比较有特色的知识点:KVC和KVO 一.KVC操作OC中的KVC操作就和Java中使用反射机制去访问类的private权限的变量,很暴力的,这样做就会破坏类的封装性,本来类中的的priva ...
- iOS开发中KVC、KVO简介
在iOS开发中,KVC和KVO是经常被用到的.可以使用KVC对对象的属性赋值和取得对象的属性值,可以使用KVO监听对象属性值的变化.简单介绍一下KVC和KVO. 一:键值编码(KVC) KVC,全称 ...
- 转:KVC 与 KVO 理解
KVC 与 KVO 理解 On 2012 年 6 月 7 日, in iPhone, by donly KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲 ...
- iOS - 详细理解KVC与KVO
详细理解KVC与KVO 在面试的时候,KVC与KVO有些时候还是会问到的,并且他们都是Objective C的关键概念,在这里我们先做一个简单地介绍: (一)KVC: KVC即指:NSKeyValue ...
- 【原】iOS中KVC和KVO的区别
在iOS开发中经常会看到KVC和KVO这两个概念,比较可能混淆,特地区分一下 KVC(Key Value Coding) 1> 概述 KVC:Key Value Coding,键值编码,是一种间 ...
随机推荐
- win7下安装mysql后修改密码
mysql的安装教程网上很多,此处不过多介绍,个人觉得下面这篇教程是比较好的,一步到位.MySQL 5.7.9 ZIP 免安装版本配置过程_百度经验 http://jingyan.baidu.com ...
- FFT 快速傅里叶变换浅析
终于补完坑了哈哈哈 这个东西很神奇,看了半天网上的解释和课件,研究了很长时间,算是大概明白了它的原理. 话不多说先上图. 我们要求的h(x)=f(x)*g(x),f(x)=Σai*x^i,g(x)=Σ ...
- javascript判断数字是integer还是float
function isFloat(n) { return n === +n && n !== (n|0); } function isInteger(n) { // 仅能检查32位的数 ...
- linux: 常用copy 命令
1.scp 2.递归复制: \cp -r backup/* /root/tomcat8/webapps/zefun/ngViews/wechat/ p.p1 { margin: 0.0px 0.0p ...
- BP神经网络原理及python实现
[废话外传]:终于要讲神经网络了,这个让我踏进机器学习大门,让我读研,改变我人生命运的四个字!话说那么一天,我在乱点百度,看到了这样的内容: 看到这么高大上,这么牛逼的定义,怎么能不让我这个技术宅男心 ...
- JAVA源码分析-HashMap源码分析(一)
一直以来,HashMap就是Java面试过程中的常客,不管是刚毕业的,还是工作了好多年的同学,在Java面试过程中,经常会被问到HashMap相关的一些问题,而且每次面试都被问到一些自己平时没有注意的 ...
- 今天开始学习java编程
<java>程序设计教程与上机实验
- bootstrap学习笔记--bootstrap安装环境
Bootstrap 安装是非常容易的.此文是本人的学习汇总,便于以后查询学习,同时也希望给大家带来帮助. 下载 Bootstrap 您可以从 http://getbootstrap.com/ 上下载 ...
- 20145204&20145212信息安全系统实验二
20145204&20145212信息安全系统实验二 链接
- 基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度
http://www.cnblogs.com/bobositlife/p/aspnet-mvc-csharp-quartz-net-timer-task-scheduler.html 在之前的文章&l ...