IOS 在开发中使用KVO观测属性变化

不久前在开发中,有一个只有内部方法才能修改的变量,我就用readonly来修饰。


@property(nonatomic, readonly, getter=isShouldRequestMsg) BOOL shouldRequestMsg;


但是当值发生变化的时候,想要引发外部类对象的一些操作,我就想使用KVO去观测这个值的变化。


 [app addObserver:selfforKeyPath:@"shouldRequestMsg"options:NSKeyValueObservingOptionNewcontext:NULL];


本以为实现了这些就可以获取想要的状态变化,断点却发现没碰到对应的KVO方法。


对于readonly的属性,外部只有read的权限,没有write的权限,也就是说外部不能明确的检测到一个readonly属性的变化状态。


所以预期的效果,没有达到,后来把readonly的修饰符去掉,程序如想象的正常运行。


@property(nonatomic,getter=isShouldRequestMsg) BOOL shouldRequestMsg;


注意在addObserver的类的实现中,在dealloc方法中去remove掉对应keyPath的Observer。


如下:

[app removeObserver:self forKeyPath:@"shouldRequestMsg"];


如果你在dealloc方法中,remove掉没有注册的keypath,将会造成crash.


总结:

KVO机制的运行是可取的,但是凡是涉及到属性的读取状态的变化的,还是要慎重使用,注意细节,方能减少bug的出现。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值