一、KVC与KVO
*“KVC”:key value Coding(键值编码)
*目的:间接的修改或获取对象的属性,降低程序(类与类)之间的耦合度.
*“KVO”:key value Observer(键值观察),观察者模式.(检测模型变化用的多)
*目的:通常用于观察某个对象的某个属性发生变化时,及时做出相应.
二、KVC的使用方式

KVC被称为iOS开发平台的大招!!! 能快速修改对象属性。

*[p1setValue:@“xxxx”forKeyPath:@“name”];修改指定对象属性.
*[arrvalueForKeyPath:@“book.bookName”];  获取对象属性.
*KVC通过键能直接取得数组.
*在使用KVC时, 一定要保证键值是存在的.
*原理: KVC取值时, 如果发现取值的对象不包含指定的键值,会自动进入对象内部成员进行查找.

三、KVO的使用方式
*KVO通常用于观察”对象某个属性”发生变化时,做出相应的反应.(多用于观察模型数据)
*KVO和通知中心的一个区别 : KVO只能盯着某个对象(在当前区域内部工作),通知中心可以穿越很多层(如viewController).
*KVO使用步骤:
*1.[stuaddObserver:selfforKeyPath:@"name" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:@"myObserver"];
*2.observeValueForKeyPath.  当指定键值发生改变时, 会自动调用这个方法
*3.removeObserver. 所有观察者模式的性能都不好,需要及时移除。
直接上代码:
//
//  XNViewController.m
//  KVC----KVO
//
//  Created by neng on 14-6-21.
//  Copyright (c) 2014年 neng. All rights reserved.
//#import "XNViewController.h"
#import "XNPerson.h"
#import "XNStudent.h"
#import "XNBook.h"@interface XNViewController ()@end
/***  KVC: Key Value Coding(键值编码)*  间接修改/获取对象的属性, 降低类与类之间的耦合度.*  KVO: Key Value Observer(键值观察)KVO通常用于观察”对象的某个属性“发生变化时,及时做出响应!而NSNotificationCenter是需要POST"通知字符串"(表示监听的事件类型)的对象存在,通知中心才能够工作!*/@implementation XNViewController- (void)viewDidLoad {[super viewDidLoad];//1.简单的修改对象属性[self kvcDemo1];//2.对于子类, 也能直接修改[self kvcDemo2];//3.修改对象的book属性. (相当麻烦, 好要创建book对象).KVC一句话[self kvcDemo3];//4.获取对象的属性值. 可批量获取(如果是数组的话).[self kvcDemo4];//KVO 演示[self kvoDemo];
}- (void)kvoDemo {XNStudent *stu = [[XNStudent alloc] init];stu.name = @"xuneng";//设置监听对象//1》 负责观察的对象 self//2》 观察的键值路径//3》 观察的选项//4》 上下文:通常用于区分不同的观察事件[stu addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:@"myObserver"];stu.name = @"neng"; //修改//所有观察者模式的性能都不好, 需要及时移除[stu removeObserver:self forKeyPath:@"name"];stu.name = @"xu";  //移除后再次修改
}/**当KVO指定的对象键值发生改变时, 会自动调用该方法name:      观察的键值object:    观察的对象change:    修改的字典(新旧数值)context:   指定观察者时传入的上下文*/
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {NSLog(@"|-- %@ --|-- %@ --|-- %@ --|-- %@--|", keyPath, object, change, context);
}/***简单的修改对象属性*/
- (void)kvcDemo1 {//1.原始的方式. 点语法修改对象属性的值XNPerson *p1 = [[XNPerson alloc] init];p1.name = @"xuneng";p1.age = 24;//    NSLog(@"%@ , %d",p1.name,p1.age);NSLog(@"KVC1 demo1--> %@", p1); //这样直接调用description方法.//2.KVC来修改[p1 setValue:@"xxxx" forKeyPath:@"name"];[p1 setValue:@"10" forKeyPath:@"age"];NSLog(@"KVC2 demo1--> %@ , %d", p1.name, p1.age);
}/***对于子类, 也能直接改*/
- (void)kvcDemo2 {//1.传统方法XNStudent *p1 = [[XNStudent alloc] init]; //学生p1.name = @"student xuneng";p1.age = 22;//    NSLog(@"%@ , %d",p1.name,p1.age);NSLog(@"KVC1 demo2--> %@", p1); //这样直接调用description方法.//2.KVC来修改子类[p1 setValue:@"xxxx" forKeyPath:@"name"];[p1 setValue:@"10" forKeyPath:@"age"];NSLog(@"KVC2 demo2--> %@ , %d", p1.name, p1.age);
}/***修改对象的book属性. (相当麻烦, 好要创建book对象).KVC一句话*/
- (void)kvcDemo3 {//1.传统方法XNStudent *p1 = [[XNStudent alloc] init]; //学生p1.name = @"student xuneng";p1.age = 22;XNBook *myBook = [[XNBook alloc] init];myBook.bookName = @"iOS";p1.book = myBook;NSLog(@"KVC1 demo3--> %@", p1);//2.KVC的方法[p1 setValue:@"iPhone" forKeyPath:@"book.bookName"]; //学生里的book,book里的bookNameNSLog(@"KVC2 demo3--> %@", p1);
}/***获取对象的属性值. 可批量获取(如果是数组的话).*/
- (void)kvcDemo4 {XNStudent *p1 = [[XNStudent alloc] init]; //学生1p1.name = @"student1 xuneng";p1.age = 24;XNBook *myBook1 = [[XNBook alloc] init];myBook1.bookName = @"iOS";p1.book = myBook1;XNStudent *p2 = [[XNStudent alloc] init]; //学生2p2.name = @"student2 xuneng";p2.age = 23;XNBook *myBook2 = [[XNBook alloc] init];myBook2.bookName = @"iPhone";p2.book = myBook2;NSArray *arr = @[p1, p2];//1.普通方法获取数组中对象的属性NSMutableArray *arrBook = [[NSMutableArray alloc] init];for (XNStudent *stu in arr) {[arrBook addObject:stu.book.bookName];}NSLog(@"KVC1 demo4--> %@", arrBook);//2.KVC方法来获取数组中对象NSLog(@"KVC2 demo4--> %@", [arr valueForKeyPath:@"book.bookName"]);
}@end

例子源码下载:http://download.csdn.net/detail/xn4545945/7571719

转载请注明出处:http://blog.csdn.net/xn4545945  

【iOS】KVC 与 KVO相关推荐

  1. iOS KVC和KVO

    一. KVC KVC也就是key-value-coding,即键值编码,最常见的两种用法就是: 1). 对私有变量进行赋值,同样的也可以通过它进行取值 对某一个属性进行赋值,可以不用加下划线,它的查找 ...

  2. iOS KVC和KVO简介

    kvc KVC,即是指 NSKeyValueCoding,一个非正式的 Protocol,它是一种可以直接通过字符串的名字(key)来访问类属性的机制(一种间接访问对象的属性的机制). 常见的 获取值 ...

  3. iOS 中KVC、KVO、NSNotification、delegate 总结及区别

    iOS 中KVC.KVO.NSNotification.delegate 总结及区别 1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属 ...

  4. Ios KVC KVO

    一.KVC与KVO *"KVC":key value Coding(键值编码) *目的:间接的修改或获取对象的属性,降低程序(类与类)之间的耦合度. *"KVO" ...

  5. ios 通过kvc修改属性会触发kvo_iOS开发-KVC和KVO的理解

    KVC和KVO看起来很专业,其实用起来还是比较简单的,KVC(Key-value coding)可以理解为键值对编码,如果对象的基本类型,那么键值对编码实际上和get,set方法没有区别,如果是属性是 ...

  6. 【iOS】—— KVC与KVO

    KVC与KVO 一.KVC 1.简单介绍 2.常见的API 3.key和keyPath的区别 4.KVC原理 4.1 `setValue:forKey: `的原理(KVC赋值原理) 4.2 `valu ...

  7. ios中的KVC和KVO

    最近研究了一下子KVC和KVO,KVC:即Key-Value-Coding 而KVO:即Key-Value-Observer KVC是针对NSObject的子类,因为它的实现是由于其括展类NSObje ...

  8. Objective-C中的KVC与KVO(上)

    本文转载 李朴之先生博客 http://blog.csdn.net/pucker/article/details/7413280 Objective-C中的KVC与KVO是两种比较重要的技术,这里简要 ...

  9. apple开发者文档关于KVC和KVO文档的一些渣翻——这里是原地址

    apple开发者文档关于KVC和KVO文档的一些渣翻--这里是原地址 Key-Value Coding Programming Guide KVC编程介绍 介绍 本文档用来描述NSKeyValueCo ...

最新文章

  1. 《Linux命令详解手册》——Linux畅销书作家又一力作
  2. JUC多线程核心知识-思维导图
  3. 14条建议,使你的IT职业生涯更上一层楼
  4. javascript中break和continue
  5. STM32开发 -- PMIC、I2C详解
  6. IDEA创建springboot项目:Unable to import maven project: See logs for details
  7. html高德地图api使用教程,高德地图API如何使用?
  8. 【UOJ574】多线程计算【二元二项式反演】【定积分】【矩阵】【NTT 卷积】
  9. ElasticSearch(笔记)
  10. java中将数字颠倒的工具类,java开发中常用的数字工具类
  11. 位图(bitmap)—— C语言实现
  12. 【FPGA】TestBench中关于@eachvec
  13. android api (82) —— InputConnection [输入法]
  14. 装载list的时候 一定要把每一个实体放到for里面
  15. python多线程刷网站流量(含ip代理池文档,可制作成exe文件挂服务器代刷)
  16. Kubernetes监控体系(1)-cAdvisor介绍
  17. mysql简历上怎么写_新手程序员简历应该怎么写?
  18. 《21天学通HTML+CSS+JavaScript Web开发(第7版)》——2.4 您要在Web上做什么
  19. 传奇GEE引擎版本如何封挂?GEE引擎设置简单的封挂脚本教程
  20. ssh开启图形界面_【工具大道】ssh登录Linux服务器,并显示图形化界面

热门文章

  1. python中a* b是什么意思_Python中a-=b与a=a-b的区别是什么?
  2. Hadoop1000条笔记总汇
  3. 防华为手表太空人主题界面 | html5 代码实现
  4. python培训学校哪儿好_昆山学习python哪儿好
  5. 公司金融课程知识点记录(一) 第二、三章节——斯坦利·布洛克编著教科书
  6. 你离英文的技术文档大神,只差这个中英文对照!
  7. (失败记录)用CMD加密文件夹
  8. 3天3连板,你敢想吗?太牛了!
  9. word2003中,格式刷有快捷键吗
  10. 最强黑客组织“匿名者”常用安全渗透软件