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