iOS基礎知識整理之KVC與KVO
阿新 • • 發佈:2018-12-10
- 如何理解KVC? 在iOS中每一個物件的建立屬性的過程中,以KVC的角度理解會建立一個對應的鍵值對,這個鍵值對的key為設定的物件的屬性值,而對於該屬性的值為對應的value值。如果存在多層呼叫關係需要用到keypath來實現。如下Person型別實力物件有1個屬性為name對這個屬性的賦值以及取值的過程如下,通過key和value的形式。如果存在多層屬性需要通過keypath的如p1.name形式作為key的方式來實現。
Person *p1 = [[Person alloc] init]; p1.name = @"xiaoming"; NSLog(@"name value = %@",[p1 valueForKey:@"name"]); [p1 setValue:@"xiaohua" forKey:@"name"]; NSLog(@"name new value = %@",[p1 valueForKey:@"name"]);
- 如何理解KVO? KVO是在kvc的基礎上,通過觀察觀察物件屬性對應的key值對應的value值得變化來檢測。來實現KVO的目的。實現如下所示
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. Person *p1 = [[Person alloc] init]; p1.name = @"xiaoming"; p1.address = @"hello world"; [p1 addObserver:self forKeyPath:@"name" options:0 context:nil]; NSLog(@"name value = %@",[p1 valueForKey:@"name"]); [p1 setValue:@"xiaohua" forKey:@"name"]; NSLog(@"name new value = %@",[p1 valueForKey:@"name"]); } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context { if (keyPath.length>0) { NSLog(@"name kvo value = %@",[object valueForKey:keyPath]); } }