1,ios中KVO和KVC是什么一、KVO是注册观察者模式 , 是一种监听模式 。(1)通过注册观察者addObserve的方法,可以获取监听的对象变化的值,从而实现要变化的方法 。(2)例如有两个滑动视图,希望其中一个视图滑动时候,另一个视图也跟着变化,同时变化相同的偏移量 , 那么可以注册一个观察者,观察视图1的偏移量变化,在观察者方法-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void *)context中,根据change的值获得视图1的偏移量 , 并让视图二做出相同的偏移 。二、KVC是访问对象属性的方法,K即key,V即Value,C是coding系统的编码方式 。(1)通过setValue:forKey的方式,给对象的某一个属性赋值,在未公开属性的情况下就可以使用这种方法. (2)比如有一个Person类,有一个Person *person = [[Person alloc] init]对象,想给个name属性,并给name一个值“张三” , 就可以写成[person setValue:"张三" forKey:"name"],如果说person又一个公开的name属性,那么上一句话就等于person.name=@"张三" 。http://www.mamicode.com/info-detail-515516.htmlkvo是监听(比如某个值变化了 就会调用个方法通知 。具体百度下 好多列子) kvc好像说的是访问对象属性 这个项目中没用到过 据说是鸡肋 。。。
2,ios中KVO和KVC是什么一、KVO是注册观察者模式,是一种监听模式 。(1)通过注册观察者addObserve的方法,可以获取监听的对象变化的值,从而实现要变化的方法 。(2)例如有两个滑动视图,希望其中一个视图滑动时候 , 另一个视图也跟着变化,同时变化相同的偏移量,那么可以注册一个观察者,观察视图1的偏移量变化 , 在观察者方法-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context中,根据change的值获得视图1的偏移量,并让视图二做出相同的偏移 。二、KVC是访问对象属性的方法,K即key,V即Value,C是coding系统的编码方式 。(1)通过setValue:forKey的方式,给对象的某一个属性赋值,在未公开属性的情况下就可以使用这种方法.(2)比如有一个Person类,有一个Person *person = [[Person alloc] init]对象,想给个name属性,并给name一个值“张三”,就可以写成[person setValue:"张三" forKey:"name"],如果说person又一个公开的name属性,那么上一句话就等于person.name=@"张三" 。【ioskvc kvo,ios中KVO和KVC是什么】
3 , ios中kvo能观察多个对象吗KVO可以观察多个对象 。观察者模式主要是 , 通过一个对象来管理所有依赖于它的观察者对象 , 并在它自身的状态改变时主动通知观察者对象 。目标对象通知观察者通常是通过调用各观察对象所提供的接口方法来实现的.观察者模式比较完美的将目标对象与观察者对象解耦.KVO 的应用场景:当一个对象的特定属性改变的时候,需要被通知一个或者多个对象的时候 。KVO 的使用流程:当一个观察者需要观察多个对象的同一个keyPath时,可以通过设置context来区分不同的通知 。注册与解除注册keyPath不可以为nil- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;设置Value[target setAge:30];//setter[target setValue:[NSNumber numberWithInt:30] forKey:@"age"]; //setValue:forKey处理变更通知观察者需要实现名为 NSKeyValueObserving 的 category 方法来处理收到的变更通知- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;class a{ public string name; public static string sname="static name"; public a(string name ){this.name = name;} } class main{ public static void main(string args []){ a a1 = new a("zhangsan"); a a2 =new a("lisi"); system.out.println("a1.name="+a1.name+" a1.sname="+a1.sname); system.out.println("a2.name="+a2.name+" a2.sname="+a2.sname); } }
4,iOS 中KVCKVO菜鸟都能懂的教程@interface Person : NSObjectNSString*_name;int_age;} @end#import "Person.h"@interface ViewController :UIViewController@property (nonatomic, retain) Person* testPerson;@end- (void)viewDidLoad[superviewDidLoad];//创建Person对象testPerson = [[myPerson alloc] init];[testPerson setValue:[NSNumbernumberWithInt:18]forKey:@"age"];NSLog(@"testPersons age = %@",[testPerson valueForKey:@"age"]);}- (id)valueForKey:(NSString *)key;-(void)setValue:(id)value forKey:(NSString *)key;设置就3步:1.注册需要观察的对象的属性addObserver:forKeyPath:options:context:(一般添加self为观察者)2.实现observeValueForKeyPath:ofObject:change:context:方法,这个方法当观察的属性变化时会自动调用(这是一个回调方法)3.取消注册观察removeObserver:forKeyPath:context:(在dealloc里面写)@interface Person : NSObjectNSString*_name;int_age;} @end#import "Person.h"@interface ViewController :UIViewController@property (nonatomic, retain) Person* testPerson;@end- (void)viewDidLoad[superviewDidLoad];//创建Person对象testPerson = [[myPerson alloc] init];[testPerson addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNewcontext:nil]; }- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)contextif ([keyPath isEqualToString:@"age"])NSLog(@"new Age =%@", [change valueForKey:NSKeyValueChangeNewKey]);}}- (void)dealloc[testPerson removeObserver:self forKeyPath:@"age" context:nil];[super dealloc];}感谢码迷的文章5,ios中notification和kvo的区别notification 的 优势 :1.不需要编写多少代码,实现比较简单;2.对于一个发出的通知,多个对象能够做出反应 , 即1对多的方式实现简单3.controller能够传递context对象(dictionary),context对象携带了关于发送通知的自定义的信息缺点 :1.在编译期不会检查通知是否能够被观察者正确的处理;2.在释放注册的对象时,需要在通知中心取消注册;3.在调试的时候应用的工作以及控制过程难跟踪;4.需要第三方对喜爱那个来管理controller与观察者对象之间的联系;5.controller和观察者需要提前知道通知名称、UserInfo dictionary keys 。如果这些没有在工作区间定义,那么会出现不同步的情况;6.通知发出后,controller不能从观察者获得任何的反馈信息 。KVO 的 优势 :1.能够提供一种简单的方法实现两个对象间的同步 。例如:model和view之间同步;2.能够对非我们创建的对象,即内部对象的状态改变作出响应,而且不需要改变内部对象(SKD对象)的实现;3.能够提供观察的属性的最新值以及先前值;4.用key paths来观察属性,因此也可以观察嵌套对象;5.完成了对观察对象的抽象 , 因为不需要额外的代码来允许观察值能够被观察缺点 :1.我们观察的属性必须使用strings来定义 。因此在编译器不会出现警告以及检查;2.对属性重构将导致我们的观察代码不再可用;3.复杂的“IF”语句要求对象正在观察多个值 。这是因为所有的观察代码通过一个方法来指向;4.当释放观察者时不需要移除观察者 。【nsnotification、delegate和kvo的区别】1.效率肯定是delegate比nsnotification高 。2. delegate方法比notification更加直接 , 最典型的特征是,delegate方法往往需要关注返回值,也就是delegate方法的结果 。比如-windowshouldclose:,需要关心返回的是yes还是no 。所以delegate方法往往包含 should这个很传神的词 。也就是好比你做我的delegate,我会问你我想关闭窗口你愿意吗?你需要给我一个答案,我根据你的答案来决定如何做下一 步 。相反的 , notification最大的特色就是不关心接受者的态度, 我只管把通告放出来,你接受不接受就是你的事情 , 同时我也不关心结果 。所以notification往往用did这个词汇,比如 nswindowdidresizenotification,那么nswindow对象放出这个notification后就什么都不管了也不会等待接 受者的反应 。简明概要的说明了kvo和nsnotification的区别:和delegate一样,kvo和nsnotification的作用也是类与类之间的通信,与delegate不同的是1)这两个都是负责发出通知 , 剩下的事情就不管了,所以没有返回值;2)delegate只是一对一,而这两个可以一对多 。这两者也有各自的特点 。1)kvo的使用:被观察者发出 addobserver:forkeypath:options:context: 方法来添加观察者 。然后只要被观察者的keypath值变化(注意:单纯改变其值不会调用此方法,只有通过getters和setters来改变值才会触发kvo),就会在观察者里调用方法observevalueforkeypath:ofobject:change:context:因此观察者需要实现方法 observevalueforkeypath:ofobject:change:context: 来对kvo发出的通知做出响应 。这 些代码都只需在观察者里进行实现 , 被观察者不用添加任何代码,所以谁要监听谁注册,然后对响应进行处理即可,使得观察者与被观察者完全解耦,运用很灵活很 简便;但是kvo只能检测类中的属性 , 并且属性名都是通过nsstring来查找,编译器不会帮你检错和补全,纯手敲所以比较容易出错 。2)nsnotification的使用这里的通知不是由被观察者发出,而是由nsnotificationcenter来统一发出,而不同通知通过唯一的通知标识名notificationname来区分,标识名由发送通知的类来起 。首先被观察者自己在必要的方法a里,通过方法postnotificationname:object:来发出通知notificationname这样发送通知者这边的工作就完成了,每次a被调用,就会发送一次通知notificationname 。然后谁要监听a的变化 , 就通过[nsnotificationcenter defaultcenter]的方法addobserver:selector:name:object:为观察者注册监听name为notificationname的通知然后每次发出name为notificationname的通知时,注册监听后的观察者就会调用其自己定义的方法notificationselector来进行响应 。nsnotification的特点呢,就是需要被观察者先主动发出通知 , 然后观察者注册监听后再来进行响应,比kvo多了发送通知的一步,但是其优点是监听不局限于属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用也更灵活 。6,通知和kvo分别在什么时候使用iOS 中KVC、KVO、NSNotification、delegate 总结及区别1、KVC , 即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性 。而不是通过调用Setter、Getter方法访问 。KVO 就是基于 KVC 实现的关键技术之一 。Demo:@interface myPerson : NSObjectNSString*_name;int_age;int_height;int_weight;} @end@interface testViewController :UIViewController @property (nonatomic, retain) myPerson*testPerson; @end- (void)testKVCtestPerson = [[myPerson alloc] init];NSLog(@"testPersons init height =%@", [testPerson valueForKey:@"height"]);[testPerson setValue:[NSNumber numberWithInt:168]forKey:@"height"];NSLog(@"testPersons height = %@", [testPerson valueForKey:@"height"]);}第一段代码是定义了一个myPerson的类,这个类有一个_height的属性,但是没有提供任何getter/setter的访问方法 。同时在testViewController这个类里面有一个myPerson的对象指针 。当myPerson实例化后,常规来说是无法访问这个对象的_height属性的 , 不过通过KVC我们做到了,代码就是testKVC这个函数 。运行之后打印值就是:2015-3-13 11:16:21.970 test[408:c07] testPersons init height = 02015-3-13 11:16:21.971 test[408:c07] testPersons height = 168这就说明确实读写了_height属性 。KVC的常用方法:- (id)valueForKey:(NSString *)key; -(void)setValue:(id)value forKey:(NSString *)key;valueForKey的方法根据key的值读取对象的属性 , setValue:forKey:是根据key的值来写对象的属性 。注意:(1). key的值必须正确,如果拼写错误,会出现异常(2). 当key的值是没有定义的,valueForUndefinedKey:这个方法会被调用,如果你自己写了这个方法 , key的值出错就会调用到这里来(3). 因为类key反复嵌套,所以有个keyPath的概念,keyPath就是用.号来把一个一个key链接起来,这样就可以根据这个路径访问下去(4). NSArray/NSSet等都支持KVC2、KVO的是KeyValue Observe的缩写,中文是键值观察 。这是一个典型的观察者模式,观察者在键值改变时会得到通知 。iOS中有个Notification的机制,也可以获得通知,但这个机制需要有个Center,相比之下KVO更加简洁而直接 。KVO的使用也很简单 , 就是简单的3步 。1.注册需要观察的对象的属性addObserver:forKeyPath:options:context:2.实现observeValueForKeyPath:ofObject:change:context:方法,这个方法当观察的属性变化时会自动调用3.取消注册观察removeObserver:forKeyPath:context:Demo:@interface myPerson : NSObjectNSString *_name;int_age;int_height;int_weight;}@end@interface testViewController : UIViewController@property (nonatomic, retain) myPerson *testPerson;- (IBAction)onBtnTest:(id)sender;@end- (void)testKVOtestPerson = [[myPerson alloc] init];[testPerson addObserver:self forKeyPath:@"height" options:NSKeyValueObservingOptionNew context:nil];}- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)contextif ([keyPath isEqualToString:@"height"])NSLog(@"Height is changed! new=%@", [change valueForKey:NSKeyValueChangeNewKey]);} else[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];}}- (IBAction)onBtnTest:(id)senderint h = [[testPerson valueForKey:@"height"] intValue];[testPerson setValue:[NSNumber numberWithInt:h+1] forKey:@"height"];NSLog(@"person height=%@", [testPerson valueForKey:@"height"]);}- (void)dealloc[testPerson removeObserver:self forKeyPath:@"height" context:nil];[super dealloc];}第一段代码声明了myPerson类,里面有个_height的属性 。在testViewController有一个testPerson的对象指针 。在testKVO这个方法里面,我们注册了testPerson这个对象height属性的观察,这样当testPerson的height属性变化时 , 会得到通知 。在这个方法中还通过NSKeyValueObservingOptionNew这个参数要求把新值在dictionary中传递过来 。重写了observeValueForKeyPath:ofObject:change:context:方法,这个方法里的change这个NSDictionary对象包含了相应的值 。需要强调的是KVO的回调要被调用,属性必须是通过KVC的方法来修改的,如果是调用类的其他方法来修改属性,这个观察者是不会得到通知的 。支持一下感觉挺不错的
推荐阅读
- android手机开发入门教程,Android入门教程3Hello Android
- 培训管理系统开发,在线培训管理系统怎么搭建
- 欧姆龙plc编程指令表,欧姆龙的plc中的编程指令都有哪些
- 安卓怎么转移照片到iphone,怎么把安卓手机里的照片传到苹果手机里
- 图片服务器oss 图片服务器分离怎么做的
- 速冷速热模温机厂,帮我推荐两家质量好的模温机生产厂家
- ios用什么语言开发好玩,ios开发用什么语言
- c语言编译简单游戏代码,求C语言编写的壁球小游戏的源代码谢谢
- 尼康d200网友点评 泰国尼康d200