例如想通过kvo监听当前控制器view的frame改变
- 通过addObserver增加监听
#define keyPath(objc,keyPath) @(((void)objc.keyPath,#keyPath))
// Observer:观察者 谁想监听
// KeyPath:监听的属性
// options:监听新值的改变
[self.view addObserver:self forKeyPath:@"frame"
options:NSKeyValueObservingOptionNew context:nil];
//最好使用下面的方式,避免手动输入字符串错误
[self.view addObserver:self forKeyPath:keyPath(self.view, frame)
options:NSKeyValueObservingOptionNew context:nil];
说明:// 在文件头部加上keyPath的自定义宏,把属性转换为字符串
- 在当前控制器中实现observeValueForKeyPath方法,每当属性改变就会调用这个方法
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object change:(NSDictionary *)change
context:(void *)context
{
if([keyPath isEqualToString:@"price"])
{
myLabel.text = [stockForKVO valueForKey:keyPath(self.view, frame)];
}
}
- kvo作为一个中间对象,在当前控制器销毁时任然会存在,所以在销毁时应该移除当前观察释放kvo对象
- (void)dealloc
{
// 移除观察者
[self.view removeObserver:self forKeyPath:keyPath(self.view, frame)];
}