分配值时的KVO触发没有差异

Nia*_*ack 8 cocoa key-value-observing ios

如果我有如下财产

@property(assign, nonatomic) NSUInteger myValue;
Run Code Online (Sandbox Code Playgroud)

并为其分配属性

self.myValue = 2;
Run Code Online (Sandbox Code Playgroud)

KVO将按预期射击.如果,稍后,我会为其分配相同的值

self.myValue = 2;
Run Code Online (Sandbox Code Playgroud)

KVO将再次开火.我曾假设如果指定的值没有差异,Objective-C中的KVO将不会触发.看来我不对.

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

谢谢你的回复.

Rob*_*ier 14

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

如果需要检查值的变化或不变,可以通过传递选项作为观察者NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld.然后,您将收到新旧值,您可以决定是否对该信息执行任何操作.然而,我在实践中发现,这不应该经常需要.