当前位置:首页 > 操作系统 > Ios

【iOS】KVC 与 KVO

一、kvc与kvo

* kvc ”: key value coding ( 键值编码 )
* 目的 : 间接 改动或获取 对象的属性 , 减少程序 ( 类与类 ) 之间的耦合度 .

* kvo ”: key value observer ( 键值观察 ) , 观察者模式 .(检測 模型变化用的多 )
* 目的 : 通经常使用于 观察 某个对象的 某个属性发生变化 , 及时做出对应 .

二、kvc的使用方式

kvc 被称为 ios 开发平台的大招 !!! 能高速改动对象属性。

* [p1 setvalue :@“xxxx” forkeypath :@“name”]; 改动指定对象属性 .
* [arr valueforkeypath :@“book.bookname”];   获取对象属性 .
* kvc 通过键能直接取得数组 .
* 在使用 kvc , 一定要 保证键值是存在 .
* 原理 kvc 取值时 , 假设发现取值的对象不包括指定的键值 , 会自己主动进入对象内部成员进行查找 .

三、kvo的使用方式

* kvo 通经常使用于观察 对象某个属性 发生变化时 , 做出对应的反应 . ( 多用于 观察模型数据 )
* kvo 和通知中心的一个差别 : kvo 仅仅能盯着某个对象 ( 在当前区域内部工作 ), 通知中心能够穿越非常多层(如viewcontroller) .
* kvo 使用步骤 :
* 1. [stu addobserver :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://www.cnblogs.com/mthoutai/p/6857232.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!