不久前在开发中,有一个只有内部方法才能修改的变量,我就用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的出现。