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,键值编码,是一种间 ...
随机推荐
- jsp上传图片实时显示
jsp代码 <div class="form-group" id="caseIma"> <label class="control- ...
- Beta阶段发布说明
OverWatch来浪狼人杀助手Beta版本发布说明 Beta版本的新功能 添加了忘记密码与重置密码的功能 添加了语音流程提示的功能 添加了搜索好友的功能 添加了添加好友的功能 添加了能够直接通过点击 ...
- winform开发 总结1>winform程序使用线程的必要性,以及正确的使用方式
winform程序中使用线程的必要性: 单线程操作在执行耗时任务时会造成界面假死,带来非常差劲的用户体验,有时候甚至会影响到正常的业务执行,使用多线程做相关操作实属不得已之举. 那么在编写程序之前必须 ...
- 【实践】Memcached实例解析
一.关于Memcached Memcached是一个自由开源的,高性能,分布式内存对象缓存系统. Memcached是一种基于内存的Key-Value存储,用来存储小块的任意数据(字符串.对象).这些 ...
- Think twice before doing~
1.遇到任何矛盾,对事不对人. 2.接到朋友等人的求助电话后,一定要先问清楚对方有什么事情,然后再告诉他(她)能不能帮她(他). 3.如果没有十足的把握和必要,就不要轻易说假话. 4.少提自己的私事, ...
- Date类
Date类 构造方法: Date():根据当前的默认毫秒值创建对象 Date(long date):根据给定的默认毫秒值创建对象 成员方法: public long getTime():获取时间,以毫 ...
- python发送邮件
python发送邮件(无附件) ======================================================= #!/usr/bin/env python#coding ...
- ThinkPHP框架之验证码
Think\Verify类可以支持验证码的生成和验证功能. 下面是最简单的方式生成验证码: $Verify = new \Think\Verify(); $Verify->entry(); 上面 ...
- Mysql字符集设置
转 基本概念 • 字符(Character)是指人类语言中最小的表义符号.例如’A'.’B'等:• 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encodi ...
- 移动Web初级入门
最好的阅读是输出. –玉伯 即将开始涉入移动Web了,有点小兴奋也有点小紧张,希望能在未来的团队里带来一些价值.记录一下我现在所认识的移动Web. 原文摘自我的前端博客,欢迎大家来访问 原文地址:ht ...