KVO中,当被观察的属性改变时,KVO被触发。举例如下:
KVO监测Person类实例person的name属性。当name值改变时,方法- setName:
被调用。此时下面两个方法会在运行- setName:
之前之后被调用。
- (void)willChangeValueForKey:(NSString *)key
- (void)didChangeValueForKey:(NSString *)key
如果我们实现了- setName:
方法或者使用synthesize的nameaccessor 到时候就会发生这样的事情。
有些情况下当我们需要override -setLComponent:
并且我们要控制是否发送键值改变的通知的时候,我们要做以下的事情:
+ (BOOL)automaticallyNotifiesObserversForName
{
return NO;
}
- (void)setName:(NSString *)lComponent
{
if (_name == name)
{
return;
}
[self willChangeValueForKey:@"name"];
_name == name;
[self didChangeValueForKey:@"name"];}
我们关闭了-willChangeValueForKey:
和 -didChangeValueForKey:
的自动调用,然后我们手动调用他们。我们只应该在关闭了自动调用的时候我们才需要在 setter 方法里手动调用 -willChangeValueForKey:
和-didChangeValueForKey:
。
备注:
可以参考下面两篇文章: