2. OC語法-KVO和KVC

一、KVO

1.1 KVO

KVO的全稱是Key-Value Observing,俗稱“鍵值監聽”,可以用於監聽某個對象屬性值的改變
在這裏插入圖片描述

1.2 未使用KVO監聽的對象

在這裏插入圖片描述

1.3 使用了KVO監聽的對象

在這裏插入圖片描述

1.4 _NSSet*ValueAndNotify的內部實現

[selfwillChangeValueForKey:@"age"];

// 原來的setter實現

[self didChangeValueForKey:@"age"];
  • 調用willChangeValueForKey:
  • 調用原來的setter實現
  • 調用didChangeValueForKey:
    • didChangeValueForKey:內部會調用observer的observeValueForKeyPath:ofObject:change:context:方法

1.5 KVO基本使用

// 1. 給person1對象的age和height屬性添加KVO監聽
NSKeyValueObservingOptions options = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld;
[self.person1 addObserver:self forKeyPath:@"age" options:options context:@"123"];

// 2. 移除KVO監聽
- (void)dealloc {
    [self.person1 removeObserver:self forKeyPath:@"age"];
    [self.person1 removeObserver:self forKeyPath:@"height"];
}

// 3. 監聽屬性的改變
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
    NSLog(@"監聽到%@的%@屬性值改變了 - %@ - %@", object, keyPath, change, context);
}

二、KVC

2.1 KVC

  • KVC的全稱是Key-Value Coding,俗稱“鍵值編碼”,可以通過一個key來訪問某個屬性
  • 常見的API有
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath; 
- (void)setValue:(id)value forKey:(NSString *)key;
- (id)valueForKeyPath:(NSString *)keyPath;
- (id)valueForKey:(NSString *)key;

2.2 setValue:forKey:的原理

  • accessInstanceVariablesDirectly方法的默認返回值是YES
    在這裏插入圖片描述

2.3 valueForKey:的原理

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章