KVO是key-value observing的缩写
kvo是object-c对观察者模式的又一实现
apple使用了isa混写(isa-swizzling)来实现kvo
image.png
//调用kvo方法监听obj的value属性的变化
- [obj addObserver:observer forKeyPath:@"value" options:NSKeyValueObservingOptionNew context:NULL];
//监听到变化回调
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
if ([object isKindOfClass:[MObject class]] &&
[keyPath isEqualToString:@"value"]) {
//获取value的新值
NSNumber *valueNum = [change valueForKey:NSKeyValueChangeNewKey];
NSLog(@"value is %@", valueNum);
}
}
//使用setter方法改变值kvo会生效
//使用setValue:forKey改变值kvo会生效
//成员变量直接赋值需要手动添加kvo才会生效
- (void)increase
{
//直接为成员变量赋值
[self willChangeValueForKey:@"value"];
_value += 1;
[self didChangeValueForKey:@"value"];
}
KVC
kvc是key-value coding的缩写
- -(nullable id)valueForKey:(NSString *)key;
- -(void)setValue:(nullable id)value forKey:(NSString *)key;
kvc键值编码技术会破坏面向对象编程思想,通过accessInstanceVariablesDirectly返回NO来支持面向对象思想(默认返回yes)
调用valueForKey先判断有没有实现get方法(访问器方法是否存在?getKey/key/isKey),没有就去判断有没有对应的实例变量(同名或相识:_key/_isKey/key/isKey),再没有会抛出未定义key的异常
image.png
调用setValue:forKey
image.png
网友评论