8

如果我有如下属性

@property(assign, nonatomic) NSUInteger myValue;

并为其分配一个属性

self.myValue = 2;

KVO 将按预期触发。如果,稍后,我给它分配相同的值

self.myValue = 2;

KVO 将再次触发。我假设如果分配的值没有不同,Objective-C 中的 KVO 不会触发。看来我是不正确的。

有没有办法强制这种默认行为,即禁用每次分配值时触发的 KVO 通知?我可以创建自己的访问器,但如果有很多我想更改的属性,这可能是很多工作......

感谢您的任何回复。

4

2 回答 2

15

KVO 在调用 setter(或其他 mutator)时触发。没有额外的检查。一般来说,KVO 是极其轻量级和性能敏感的。由于不必要的更改通常很少见,并且在大多数情况下对观察者无害,因此它们不包括检查旧值的额外开销。检查以前的值可能会很昂贵,例如,如果托管对象没有出现故障,那么做很多工作只是为了检查这种情况不是默认行为。

如果您需要检查值如何更改或未更改,您可以通过传递 options 以观察者身份进行NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld。然后,您将同时收到新值和旧值,您可以决定是否对这些信息进行任何处理。但是,我在实践中发现不应该经常需要它。

于 2013-01-21T22:12:54.153 回答
2

仅供参考,将此逻辑添加到设置器(使用手动更改通知),您将使用:

- (void)setValue:(int)value
{
    if (_value == value) return;
    [self willChangeValueForKey:@"value"];
    _value = value;
    [self didChangeValueForKey:@"value"];
}

+ (BOOL)automaticallyNotifiesObserversOfValue { return NO; }
于 2014-04-19T03:29:46.083 回答