iOS開發-----KVC與KVO的區別

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=
最後一次修改是直接修改  所以沒法產生通知
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章