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,键值编码,是一种间 ...
随机推荐
- 2016总结&2017计划
2016总结 总体而言,上半年比较勤快,下半年偷懒了.下半年仔细看了Barfoot的书<state estimation for robotics>,收获很大. 2017计划 目前打算写以 ...
- 微信开发包注意jar版本:
微信java jar的加密key的大小支持 异常java.security.InvalidKeyException:illegal Key Size的解决方案:在官方网站下载JCE无限制权限策略文件( ...
- winform总结3> 有趣的bat/winform程序完成自己的任务,然后把自己删除
在winform的开发过程中往往会有这样的应用场景,执行完成某任务之后,程序需要把本身删除掉.比如卸载.分享一个比较简单实现. 思路就是利用批处理,关闭文件后执行bat,bat执行删除主文件,然后删除 ...
- fsr
Front-end server render 前端在后端的渲染 1.采用express框架创建项目 express -e fsr cd fsr npm install 2.模板选用artTempla ...
- CSS之div和span标签
div和span是非常重要的标签,div的语义是division"分割": span的语义就是span"范围.跨度". 这两个东西,都是最最重要的"盒 ...
- XPath 学习二: 语法
XPath 使用路径表达式来选取 XML 文档中的节点或节点集.节点是通过沿着路径 (path) 或者步 (steps) 来选取的. 下面列出了最有用的路径表达式: 表达式 描述 nodename 选 ...
- Java虚拟机浅探
简介 对于java开发人员了来说,对java虚拟机肯定有着或多或少的了解.因为有了虚拟机的存在,才会使得java的内存管理变得那么方便,不再像C++那样使用new/delete来直接管理内存.知名的j ...
- UP board 漫谈(1)——从Atom到UP Board
title: UP board 漫谈(1)--从Atom到UP Board date: 2016-12-26 12:33:03 tags: UP board categories: 开发板 perma ...
- PHP常用函数整理
推荐网址:http://php.net/manual/zh/http://www.w3cschool.cc/php/php-ref-array.html 错误报告: error_reporting(E ...
- [Exchange 2013]创建约会和会议
简介 会议和约会之间的重要区别是,会议有与会者,并且没有约会.约会和会议可以是单实例或属于重复序列,但与会者. 房间或资源中不包括约会,因为它们不需要发送一条消息.在内部,Exchange 使用相同的 ...