8

私が次のようなプロパティを持っている場合

@property(assign, nonatomic) NSUInteger myValue;

そしてそれにプロパティを割り当てます

self.myValue = 2;

KVOは期待どおりに発砲します。後で、同じ値を割り当てた場合

self.myValue = 2;

KVOが再び発砲します。割り当てられている値に違いがなければ、Objective-CのKVOは起動しないと思いました。私は間違っているようです。

このデフォルトの動作を強制する方法はありますか?つまり、値が割り当てられるたびに発生するKVO通知を無効にする方法はありますか?独自のアクセサーを作成することもできますが、変更したいプロパティがたくさんある場合、これはかなりの作業になる可能性があります...

返信ありがとうございます。

4

2 に答える 2

15

セッター(または他のミューテーター)が呼び出されると、KVOが起動します。追加のチェックはありません。一般に、KVOは非常に軽量で、パフォーマンスに敏感です。通常、不要な変更はまれであり、ほとんどの場合、オブザーバーに無害であるため、古い値をチェックするための余分なオーバーヘッドは含まれていません。たとえば、管理対象オブジェクトに障害が発生していない場合、以前の値を確認するとコストがかかる可能性があるため、この場合を確認するためだけに多くの作業を行うことは、デフォルトの動作ではありません。

値がどのように変化したか、または変化しなかったかを確認する必要がある場合は、オプションを渡すことでオブザーバーとして確認できます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 に答える