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. C#设备处理类操作

    C#对于处理window操作系统下的设备有天然的优势,对于大多数设备读写等操作来说基本上够了,这里只讨论通过普通的大多数的设备的操作.涉及到两大类SerialPort类,Socket的一些操作.不一定 ...

  2. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  3. 网页上获取的元素值,为什么类型,string

    <body> <input type="text" value='9'/><input type="text" value='30 ...

  4. ThinkPhp 3.2 常见问题与注意事项

    1 命名空间声明必须写在脚本的最前面 如果运行PHP脚本后出现如下错误: Namespace declaration statement has to be the very first statem ...

  5. 【原创】PageAdminCMS 前台SQL注入漏洞(1)

    之前根据公司的要求找了几个web程序的漏洞提交CNVVD,发现漏洞提交上去两个月了,CNVVD却没有任何回应,我提交的这几个漏洞却悄悄的修补掉了. 文章作者:rebeyond 受影响版本:V3.0 漏 ...

  6. 12月18日Smarty文件缓存

    缓存 做缓存的目的是为了让程序运行起来更加迅速.因为如果程序访问数据库时数据量较大,执行起来会比较慢.而且每一次刷新页面都会访问依稀数据库,然后再把数据显示在页面上. 设置缓存也有一个缺点,那就是缓存 ...

  7. webpack踩坑之路——图片的路径与打包

    转自:http://www.cnblogs.com/ghost-xyx/p/5812902.html 刚开始用webpack的同学很容易掉进图片打包这个坑里,比如打包出来的图片地址不对或者有的图片并不 ...

  8. ruby 基础知识(一)

    突然今天发现一大神的博客:http://www.cnblogs.com/jackluo/archive/2013/01/22/2871655.html    相信初学者会受益颇多 ruby  参考文档 ...

  9. 解决svn pritine text not exist问题

    svn: E155032: The pristine text with checksum '$sha1$151400d1cd4c5fc190d500aa1826d45cb91f088f' not f ...

  10. SQL查询某个时间段共多少条数据

    select COUNT(*) from (表名) where (时间字段)between '2012-05-01 00:00:00' and '2012-05-31 23:59:59' 获取ASP. ...