しかし、私はまだ取得していない、KVCとプロパティアクセサメソッドの違いは何ですか?
KVCは、プロパティアクセサメソッドを呼び出す方法、またはプロパティにアクセスする方法です。
「その他のアクセス」とはどういう意味ですか? KVCの目的のために、アクセサメソッドを持たないインスタンス変数は、非公式のプロパティとしてカウントされます。一致するアクセサのペアが見つからない場合は、インスタンス変数の値を直接取得または設定します。 (これは現代のコードでは使用する価値がありません。他の場所にアクセスしようとするものについては@property
と宣言し、逆に公共の財産でないものにはKVCを使用しないでください)
プロパティアクセサメソッドは、KVCが存在する場合に呼び出すものです(KVCとすべての正常なプログラマの両方が直接ivarアクセスを行うことが好ましい)。アクセサは、合成されたアクセサが行うようにインスタンス変数を取得または設定したり、他のストレージにアクセスすることができます。
アクセサは実装であり、プロパティはインターフェイスであり、KVCはそれらを使用する1つの方法です。
setValue:forKeyPath:と単純アクセサの呼び出し点を区別するにはどうすればよいですか?
キーパスは文字列ですが、プロパティアクセス式は式です。コンパイラはプロパティアクセス式を評価し、それを1つまたは複数のObjective-Cメッセージに変換しますが、キーパスは実行時にKVCによって評価されます。
だから、あなたはキーのパスを使用する場合:
[someObject setValue:theValue forKeyPath:@"foo.bar.baz"];
を(1)それは文字列リテラル構文@"…"
ことで、この場合に示されているように、文字列だし、(2ので、あなたはそれがキーパスを知っています)を評価するには、キーパス文字列をsetValue:forKeyPath:
に渡しています。
キーパスを使用すると、KVCを使用して名前付きプロパティにアクセスしています。それはあなたのために関連アクセサメッセージを送信します。
、プロパティ・アクセス式を使用する場合:
someObject.foo.bar.baz = theValue;
をあなたは文字列でプロパティを特定していないので、それがプロパティアクセス表現を知っています。あなた自身のコードで自分自身にアクセスしています(アクセサーメッセージを送信しています)。
KVCを使用する理由はあまりありません。作成者/コンパイル時にプロパティを知っているときは、プロパティーアクセス式またはメッセージ式([[[someObject foo] bar] setBaz:theValue]
)を使用して、@property
を宣言し、プロパティに直接アクセスすることをお勧めします。 KVCを使用する時間は、実行時までアクセスしたいプロパティがわからないときです。これはまれです。主にKVO、ココアバインディング、Core Animationの部分のビルディングブロック技術です。
ほとんどの場合、あなたは自分でプロパティにアクセスしたいだけです。
**「実行時までアクセスしたいプロパティがわからないときはKVCを使用する時間です」**は私が探していたものです。 – km3h
それは私のために本当に役に立ちました。私は気にしていました** KVCを使用する時間は、実行時までアクセスしたいプロパティがわからないときです**これは理由かもしれませんが、わかりませんでした。あなたは私の考えを確信してくれました。 –
ピーターはあなたの状態です "、逆に公共の財産でないものにはKVCを使用しないでください。"プロパティーが読み取り専用として宣言され、実装で読み書き可能と宣言された場合、KVCはそのプロパティに恥知らずに書き込むことになります。これをブロックする方法はありませんか?試みました(BOOL)accessInstanceVariablesDirectly { –