1.对Person 这个类 进行监听
self.person= [[Personalloc] init];
self.person.name= @"hong";
[selftestDemoOne];
2.设置监听
[self.person addObserver:selfforKeyPath:@"name"options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNewcontext:nil];
3.监听回调值
- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void*)context
{
NSLog(@"%@",change);
}
分析 ::在ios 11以下。如果未移除监听会发生奔溃,在ios11以上苹果系统已经帮我们做了 KVO 的 keyPath
4.但是如果监听未设置 。而进行移除 。会进行奔溃 。可以有三种解决方法
4.1 在dealloc 中进行 @try 设置
- (void)dealloc
{
@try{
[self.personremoveObserver:selfforKeyPath:@"name"];
} @catch(NSException *exception) {
NSLog(@"%@",exception);
} @finally{
}
}
5.引入 facebook 的 FBKVOController.(自释放)
是如何做到自释放的呢?
其内部将观察者绑定到 FBKVOController
这个第三者上, FBKVOController
会随着观察者的释放而释放。最后, FBKVOController
在自己的 dealloc
方法中,通过 _FBKVOSharedController
这个单例来移除监听。
[self.kvoControllerunobserveAll];
[self.kvoControllerobserve:self.personkeyPath:@"name"options:NSKeyValueObservingOptionInitial|NSKeyValueObservingOptionNewblock:^(id _Nullableobserver, id _Nonnullobject, NSDictionary<NSKeyValueChangeKey,id> * _Nonnullchange) {
NSLog(@"%@::",observer);
NSLog(@"change::%@",change);
}];