您的位置:首页 > 移动开发 > IOS开发

iOS开发-----KVC与KVO的区别

2016-05-12 23:13 906 查看
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=

最后一次修改是直接修改 所以没法产生通知
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: