KVC (Key-Value Coding)键值编码。
即是NSKeyValueCoding 一个非正式的Protocol,提供了一种间接访问对象属性的机制。
作用:设置属性值
1 [self setValue:@"" forKey:@""]; 2 //可以通过点语法来赋值(跨层级) 3 [self setValue:@"" forKeyPath:@"key.key"];
获取属性值
1 [self valueForKey:@""]; 2 /// 获取属性值,可以跨层级获取 3 [self valueForKeyPath:@"key.key"];
将字典转化为模型
1 //用字典对实例进行赋值 2 [p setValuesForKeysWithDictionary:dic]; 3 // 在model要实现的方法。 4 - (void)setValue:(id)value forUndefinedKey:(NSString *)key { 5 //外部没有定义的属性。不实现的话,遇到外部没有定义的Key会Crash 6 }
KVO(Key-Value Observing)键值观察者
KVO建立在KVC之上,他能够观察一个对象的KVC Key Path的值的变化。
原理:在注册观察者时,系统会在运行时生成一个派生类,派生类重写了该对象的setter方法,并且在setter方法中实现了通知机制。同时派生类重写了class方法,以欺骗外部调用者,系统将该类的isa指针指向派生类,因此该对象就是派生类的新对象了,因此会调用该对象的setter就相当于调用派生类的setter,从而激活键值通知机制。还重写了dealloc方法来释放资源。
主要使用的是三个方法
/// 添加观察者 - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context; /// 监听到值改变 - (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary<NSKeyValueChangeKey, id> *)change context:(nullable void *)context; /// 移除观察者,便面内存泄漏 - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;