一、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里的bookName
NSLog(@"KVC2 demo3--> %@", p1);
} /**
*获取对象的属性值. 可批量获取(假设是数组的话).
*/
- (void)kvcDemo4 {
XNStudent *p1 = [[XNStudent alloc] init]; //学生1
p1.name = @"student1 xuneng";
p1.age = 24;
XNBook *myBook1 = [[XNBook alloc] init];
myBook1.bookName = @"iOS";
p1.book = myBook1; XNStudent *p2 = [[XNStudent alloc] init]; //学生2
p2.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

    来源:  对月流 链接:http://www.jianshu.com/p/f1393d10109d 写在前面: 关于KVC和KVO各种博客多了去了,重新整理下,就当是温习一下吧,也还算是个新手,不对的 ...

  2. iOS KVC 和 KVO 的学习

    KVC  (NSKey Value Coding) :键值编码 KVO (Key Value Observing) :键值监听 前言:我曾经用过 监听 一个音频何时结束 监听视频播放 状态等 用了这种 ...

  3. [iOS] KVC 和 KVO

    开发iOS经常会看见KVO和KVC这两个概念,特地了解了一下. 我的新博客wossoneri.com link KVC Key Value Coding KVC是一种用间接方式访问类的属性的机制.比如 ...

  4. iOS KVC 和 KVO 区别简单总结

    KVC: key value coding,键值编码.是一种通过使用属性的名称(key)来间接访问对象属性的方法.这个方法可以不用通过 setter/getter 方法来访问对象的属性.该方法使用的实 ...

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

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

  6. iOS中关于KVC与KVO知识点

    iOS中关于KVC与KVO知识点 iOS中关于KVC与KVO知识点  一.简介 KVC/KVO是观察者模式的一种实现,在Cocoa中是以被万物之源NSObject类实现的NSKeyValueCodin ...

  7. iOS开发中KVC、KVO简介

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

  8. iOS开发-KVC和KVO的理解

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

  9. iOS编程——Objective-C KVO/KVC机制[转]

    这两天在看和这个相关的的内容,全部推翻重写一个版本,这是公司内做技术分享的文档总结,对结构.条理做了更清晰的调整.先找了段代码,理解下,网上看到最多的一段的关于KVC的代码 先上代码 1.     1 ...

随机推荐

  1. Day11名称空间,作用域,闭包函数

    Day11 1.函数对象: ①可以被引用 ​ ②可以作为另一个函数的参数 ​ ③可以作为另一个函数的返回值0 ​ ④可以被存储到容器类型中 2.函数嵌套: ①嵌套调用:在一个函数中调用了另一个函数 ​ ...

  2. uboot-README_uboot分析

    http://wenku.baidu.com/link?url=w0sgGDHlEmfRC0FDRdcLvx0ecmvZ7NsvQ2UtfoHnciux6OCpNAmCDjS1zTUQMIZZ8A0M ...

  3. 2,格式化输出and编码基础

    格式化输出: input格式化输出: name = input('请输入姓名:') name = input('请输入姓名:') Age = int(input('请输入年龄:')) job = in ...

  4. CentOS 下通过命令登录Mysql

    CentOS 下通过命令登录Mysql: mysql -uroot -p 按回车键后输入密码

  5. 【Luogu】P3708Koishi的数字游戏(数论)

    题目链接 考虑f(i)=i%1+i%2+i%3+.....+i%n f(i+1)=(i+1)%1+(i+1)%2+......+(i+1)%n 其中不是i+1的因数的部分在f(i+1)的地方都加了1. ...

  6. 【Luogu】P1854花店橱窗布置(DP)

    照例良心题目链接 此题使用f[i][j]表示前i束花放进前j个花瓶的时候的最大值.转移方程如下 f[i][j]=max(f[i][j-1],f[i-1][j-1]+que[i][j]) 其中que[i ...

  7. [BZOJ3339] Rmq Problem(线段树)

    传送门 这个题的方法好像很多啊 1.莫队暴力 2.线段树 + 离线处理 先预处理出sg[i]表示前i个数的sg值,next[i]表示i的下一位置在哪里,如果后面再没有i,那么next[i] = n + ...

  8. 请问 内网的 dns服务器 为什么和 外网的dns服务器 一样??

    公司内的内网使用192.169.X.X的内网地址,但是在DNS段填写的是210.34.X.X,显然这是一个公网固定IP,我不明白的是:为什么内部网客户端使用的DNS服务器是公网上的IP呢?内网客户端能 ...

  9. 星球大战 BZOJ 1015

    星球大战 [问题描述] 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ...

  10. @Validated注解

    参考: https://blog.csdn.net/changerzhuo_319/article/details/55804651