kvo 的认识(后续还有修改)

1.对Person 这个类 进行监听

    self.person= [[Personallocinit];

    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);

    }];

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值