0

プロパティを定義する ClassA があります。

@interface ClassA : NSObject
@property (nonatomic) CGPoint property;
@end

実装はアクセサーをオーバーライドしません。

ClassB はセッターをオーバーライドして、追加の作業を行います。

- (void)setProperty:(CGPoint)property {
    [super setProperty:property];
    [self someAdditionalWork];
}

ClassB の別のメソッドでは、追加の作業をスキップするために、スーパー セッターを介してこのプロパティを設定しようとしています。

- (void)otherMethodInClassB {
    // ...
    super.property = newValue;
    // ...
}

これを行うと、プロパティの KVO 通知が送信されません。同じことを行って を使用するselfと、KVO 通知は期待どおりに機能します。

- (void)otherMethodInClassB {
    // ...
    self.property = newValue;
    // ...
}

何が起きてる?これは予想される動作ですか?そう言い切れるものは見当たりませんでした。

4

1 に答える 1

5

これが文書化されているかどうかはわかりませんが、これは予想される動作です。

自動 KVO 通知は、実行時にインスタンスのクラスをオリジナルClassBから自動生成されたサブクラスに静かに変更することで機能します。このサブクラスNSKVONotifying_ClassBは、必要なすべてのセッター メソッドをオーバーライドして、それらのwillChange.../didChange...呼び出しを行います。super を呼び出すことで、すべての魔法を効果的にスキップし、値の代入だけを行う元のセッターを呼び出します。

PS このブログ投稿では、この詳細について詳しく説明しています: https://www.mikeash.com/pyblog/friday-qa-2009-01-23.html

于 2014-07-15T14:26:02.200 に答える