kvc 被称为 ios 开发平台的大招 !!! 能高速改动对象属性。
三、kvo的使用方式
// // 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)!