10

家庭料理の @property セッターは次のようになるはずだと思いました。

-(void) setFoo:(Foo *)newFoo {

  // Safeguards 
  // ...

  [self willChangeValueForKey:@"foo"];
  // Switcheroo
  // ...
  [self didChangeValueForKey:@"foo"];
}

しかし、私よりもはるかに長く Cocoa を使用している人々によるブログ投稿で、次のような多くのコードを目にします。

-(void) setFoo(Foo *)newFoo {

  // Safeguards 
  // ...

  // Switcheroo
  // ...
}

私の質問は、KVO 通知メソッドを呼び出す必要があるかどうかです。それとも、最新のランタイムを使用している場合、プライベート iVar を更新するときに魔法のように行われているのでしょうか?

4

1 に答える 1

14

オプトアウトしない限り、魔法のように行われます。KVO ガイドのこのセクションをお読みください。KVC/KVO は太古の昔から (つまり が導入される前から) 存在していたので、setter がd@propertyであるかどうかは問題ではないことに注意してください。@synthesizeそれは、新旧のランタイムの二分法とは関係ありません。

この魔法 (isa-swizzling) の詳細は、Mike Ash によるブログ投稿で詳しく説明されています。魔法です。基本的に、キーが観測されると、ランタイムはセッターの実装を自動的に置き換えて、KVO 通知を呼び出します。

于 2010-07-16T01:21:41.387 に答える