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=
最後一次修改是直接修改 所以沒法產生通知