1. 程式人生 > >iOS基礎知識整理之KVC與KVO

iOS基礎知識整理之KVC與KVO

  • 如何理解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]);
    }
}