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

来源:互联网 发布:知我者芈月也 编辑:程序博客网 时间:2024/06/05 13:24

不久前在开发中,有一个只有内部方法才能修改的变量,我就用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:selfforKeyPath:@"shouldRequestMsg"];


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


总结:

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


0 0
原创粉丝点击