KVC与KVO的不同

KVC与KVO的不同,第1张

概述vc 就是一种通过字符串去间接 *** 作对象属性的机制,   访问一个对象属性我们可以 person.age  也可以通过kvc的方式   [person valueForKey:@"age"] keypath 就是属性链式访问  如 person.address.street  有点象java里面的pojo  ognl表达式子类的 假如给出的字符串没有对象的属性 会访问valueForUndefine

vc 就是一种通过字符串去间接 *** 作对象属性的机制,   访问一个对象属性我们可以 person.age  也可以通过kvc的方式   [person valueForKey:@"age"] keypath 就是属性链式访问  如 person.address.street  有点象java里面的pojo  ognl表达式子类的 假如给出的字符串没有对象的属性 会访问valueForUndefineKey方法 默认实现是raise 一个异常 但你可以重写这个方法,   setValue的时候也是一样的道理 key path accounts.transactions.payee would return an array with all the payee objects,for all the transactions,in all the accounts. 当设置一个非对象属性为nil时会抛异常, 但你也可以重写方法 kvo 就是一个在语言框架层面实现的观察者模式 通过kvc的方式修改属性时,会主动通知观察者 例子 person类 @implementation Person @synthesize name,age; -(voID) changename{     name=@"changename directly"; } @end PersonMonitor类  监视了name属性 @implementation PersonMonitor - (voID)observeValueForKeyPath:(Nsstring *)keyPath                       ofObject:(ID)object                         change:(NSDictionary *)change                        context:(voID *)context {     if ([keyPath isEqual:@"name"]) {         NSLog(@"change happen,old:%@   new:%@",[change objectForKey:NSkeyvalueChangeoldKey],[change objectForKey:NSkeyvalueChangeNewKey]);     }     } @end 测试代码     Person *p =[[Person alloc] init];         PersonMonitor *pm= [[PersonMonitor alloc]init];     [p addobserver:pm forKeyPath:@"name" options:(NSkeyvalueObservingOptionNew |                                                   NSkeyvalueObservingOptionold) context:nil];         NSLog(@"p.name is %@",p.name);     [p setValue:@"name kvc" forKey:@"name"];     NSLog(@"p name get by kvc is %@",[p valueForKey:@"name"]);     p.name=@"name change by .name=";     [p changename]; //can't be notify 输出 2011-07-03 16:35:57.406 Cocoa[13970:903] p.name is name 2011-07-03 16:35:57.418 Cocoa[13970:903] change happen,old:name   new:name kvc 2011-07-03 16:35:57.420 Cocoa[13970:903] p name get by kvc is name kvc 2011-07-03 16:35:57.421 Cocoa[13970:903] change happen,old:name kvc   new:name change by .name= 最后一次修改是直接修改  所以没法产生通知

总结

以上是内存溢出为你收集整理的KVC与KVO的不同全部内容,希望文章能够帮你解决KVC与KVO的不同所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1061887.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存