KVO:Key-Value Observing,一种通知机制,也叫做观察者模式。当对某个对象的某个数值添加了观察者之后,每当这个 对象的数值改变,观察者都能立即获得该变化通知。
实例:我有个tableview,tableview中有个自定义cell,cell中有个UISegmentedControl。现在我的需求是希望每当这个UISegmentedControl的值改变,都通知tableview做出相应对策。
解决方案:对cell声明一个属性@property (weak, nonatomic) NSString *value,在cell中UISegmentedControl对应的valueChanged方法中,设置value = seg.selectedindex;(伪码要是都看不懂还是转行吧)
然后在tableview:cellForRowAtIndexPath中设置观察者:
CustomCell *cell = 初始化;
[cell addObserver:selfforKeyPath:@"value"options:NSKeyValueObservingOptionNewcontext:nil];
//当属性的值发生变化时,自动调用此方法
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context{
//可以自行打印所有参数来看
//只关心值变的话使用,change中的new属性
if([keyPath isEqualToString:@"value"]){
NSString *strValue = [change objectForKey:@"new"];
}
}
然后就大功告成了。使用还是挺简单的。
但是呢,记得最后的最后,一定要记得把观察者给释放了,就算是ARC模式,KVO都需要手动释放,不然程序会挂掉的。
-(void)dealloc{
[cellremoveObserver:selfforKeyPath:@"value"context:nil];
#if !(__has_feature(objc_arc))
[super dealloc];
#endif
}