iOS之KVO
简介: KVO的全称是Key-Value Observing , 翻译过来就是键值监听,可以用于监听某个对象属性值的改变。
常用API :
1: 添加观察者: addObserve:forKeyPatch:option:context:
2:实现观察相应方法: observeValueForKeyPath:ofObject:change:context
3:在观察者释放之前移除对象上的监听: removeObserver:forKeyPath:
关联监听:
// .h 中有一个 fullName 属性, 他是有其他两个属性组成的, _firstName、 _lastName 他两的变化影响着 fullName 最终结果。 所以 + (NSSet*) keyPathsForValuesAffectingFullName 方法可以吧相关联属性添加进去,
- (NSString*)fullName {
return [NSString stringWithFormat:@"%@ %@", _firstName, _lastName];
}
+ (NSSet*) keyPathsForValuesAffectingFullName
{
return [NSSet setWithObjects:@"lastName", @"firstName", nil];
}
自动/手动监听
+ (BOOL) automaticallyNotifiesObserversOfSteps {
return NO;
}
监听对象中如果设置为No, 那么将会关闭自动监听,如果要使用手动监听,那么:
[_p willChangeValueForKey:@"被观察属性"];
_p.被观察属性 = 新值
[_p didChangeValueForKey:@"被观察属性"];
KVO 原理
如图:
* 未被观察的对象: 它的实例对象isa 指针指向他的类对象,从他的类对象缓存和方法列表中寻找方法实现。
* 被观察的对象 :在添加观察者的时候动态生成了一个类NSKVONotifying_Class 并且 被观察类的实例对象 把isa指针指向了动态生成的这个类。当实例调用方法的时候调用了NSKVONotifying_Class 子类的方法,方法实现调用了foundation 框架中_NSSetIntValueAndNotify 方法,set方法只要做了两件事 1.改变父类的值 2.然后通知.
* removeObserver:forKeyPath 移除观察者其实就是类对象把他的isa 指正指向他的类对象,
下一篇: iOS 底层探索 - 方法