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的更多相关文章

  1. KVC 与 KVO 理解

    KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一 ...

  2. KVC和KVO的区别

    kvc和kvo 1.kvc Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一个非正式的 Protocol,提供一种机制来间接访问对象的属性.KVO 就 ...

  3. 聊聊 KVC 和 KVO 的高阶应用

    KVC, KVO 作为一种魔法贯穿日常Cocoa开发,笔者原先是准备写一篇对其的全面总结,可网络上对其的表面介绍已经够多了,除去基本层面的使用,笔者跟大家谈下平常在网络上没有提及的KVC, KVO进阶 ...

  4. KVC 与 KVO 理解-b

    KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一 ...

  5. KVC和KVO

    OC中的一个比较有特色的知识点:KVC和KVO 一.KVC操作OC中的KVC操作就和Java中使用反射机制去访问类的private权限的变量,很暴力的,这样做就会破坏类的封装性,本来类中的的priva ...

  6. iOS开发中KVC、KVO简介

    在iOS开发中,KVC和KVO是经常被用到的.可以使用KVC对对象的属性赋值和取得对象的属性值,可以使用KVO监听对象属性值的变化.简单介绍一下KVC和KVO. 一:键值编码(KVC) KVC,全称 ...

  7. 转:KVC 与 KVO 理解

    KVC 与 KVO 理解 On 2012 年 6 月 7 日, in iPhone, by donly KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲 ...

  8. iOS - 详细理解KVC与KVO

    详细理解KVC与KVO 在面试的时候,KVC与KVO有些时候还是会问到的,并且他们都是Objective C的关键概念,在这里我们先做一个简单地介绍: (一)KVC: KVC即指:NSKeyValue ...

  9. 【原】iOS中KVC和KVO的区别

    在iOS开发中经常会看到KVC和KVO这两个概念,比较可能混淆,特地区分一下 KVC(Key Value Coding) 1> 概述 KVC:Key Value Coding,键值编码,是一种间 ...

随机推荐

  1. checkbox样式更改用户权限操作(MVC)

    数据库数据与结构下载(mysql): 链接:http://pan.baidu.com/s/1mhN9Mje 密码:j91p 源码下载: 链接:http://pan.baidu.com/s/1pLbGJ ...

  2. 浅谈:javascript的面向对象编程之具体实现

    下面的javascript代码都是需要使用jQuery插件来做的.希望大家可以搭建好工作环境 首先我们来做一个练习:在一个删除的超链接中添加一个提示信息,提示是否确认删除. 一般情况下我们都会这么做 ...

  3. Bootstrap学习笔记博客

    本片博客用于记录之后要用到Bootstrap的学习笔记   概括: Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASC ...

  4. redis 操作 list 的测试

    lpush 从头部压入数据 127.0.0.1:6379> lpush listname value1 (integer) 1//返回list的当前长度 127.0.0.1:6379> l ...

  5. form表单的属性标签

    form表单的常用标签 表单: <form id="" name="" method="post/get" action=" ...

  6. HTML基础标签入门

    HTML基础标签 昨天学习了一些HTML的基本标签以及基本属性: HTML是一种超文本标记语言,其中PHP是世界上最好的语言(增加学习的动力荣誉感). HTML文档里包含三部分: <html&g ...

  7. thinkphp修改和删除数据

    1.在控制器MainController里面写一个方法,调用Nation表中的数据. public function zhuyemian() { $n = D("Nation"); ...

  8. OpenStack三种类型的NAT转换

    SNAT SNAT即源网络地址转换,这个NAT路由修改IP包包头中的源IP地址.SNAT功能通常用于让只具有私有IP地址的主机能够访问外网,比如,多个PC使用路由器共享上网,每个PC都配置了内网IP, ...

  9. gprs/gsm 在linux下的应用

    之前有篇随笔整理了一种在裸机下用状态机+超时的机制来操作gprs/gsm,linux下就不需要了,本身有完善的调度机制,在等待的流程中直接sleep就行了. 下面是飞凌OK6410下的 demo, 其 ...

  10. css水平垂直居中对齐方式

    1.文字或者内联元素的垂直水平居中对齐 css属性 -- 水平居中:text-aligin:center; 垂直居中: line-height:height; 例子:. html: <div c ...