KVO设计模式

11 8月

delegate设计模式只能在当前对象中使用,是一对一的处理关系。如果要一对多,要通知其他对象,可以使用观察者模式。

观察者模式在IOS中用KVO(NSKeyValueObserving)来实现:

  • 观察者内用addObserver注册一个被观察者
  • 观察者内用observeValueForKeyPath接收被观察者发生变化时发出的广播
  • 观察者被销毁前用removeObserver移除注册
// 观察者是 self,被观察者是 self.webView
// 监听的是被观察者(webview)的 estimatedProgress 属性,并在发生变化时接收广播
[self.webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];

- (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary *)change context:(nullable void *)context {
    ... 
}
- (void) dealloc {
    [self.webView removeObserver:self forKeyPath:@"estimatedProgress"];
}

原理

KVO原理如下:

1.当给A类添加KVO的时候,Runtime动态的生成了一个子类NSKVONotifying_A,让A类的isa指针指向NSKVONotifying_A类,重写class方法,隐藏对象真实类信息

2.重写监听属性的setter方法,在setter方法内部调用了Foundation的_NSSetObjectValueAndNotify函数

3._NSSetObjectValueAndNotify函数内部:调用willChangeValueForKey->给属性赋值->didChangeValueForKey->调用observer的observeValueForKeyPath去告诉监听器属性值发生了改变

4.重写了dealloc做一些KVO内存释放

发表评论

邮箱地址不会被公开。 必填项已用*标注