-イントロダクション
-なぜキー・バリュー・コーディングを使うのか?
-用語集
-キー・バリュー・コーディングの基礎
-キー・バリュー・コーディングのアクセッサメソッド
-キー値の検証
-キー・バリュー・コーディング準拠を保証する
-スカラー値と構造体のサポート
-配列の演算子
-アクセッサ検索の実装の詳細
-オブジェクトの関連を表記する
-パフォーマンス

- キー・バリュー・コーディング-
アクセッサ検索の実装の詳細

この文章は、Key-Value Coding: Scalar and Structure Support を翻訳したものです。

キー・バリュー・コーディングは、値を取得、設定するために、インスタンス変数を直接のぞく前に、アクセッサメソッドを使おうとします。この記事は、キー・バリュー・コーディングがメソッドをどのように決定するのか、どのように値にアクセスするのかを説明します。

目次

setValue:forKey: のデフォルトの検索パス
valueForKey: のデフォルトの検索パス
Mac OS X 10.3 での互換性の注意

setValue:forKey: のデフォルトの検索パス

プロパティに対して setValue:forKey: のデフォルトの実装が呼び出されると、次の検索パターンが使われます:

  1. 受け手のクラスで、名前が -set<Key> に一致するアクセッサメソッドが探されます。
  2. アクセッサが見つからず、受け手のクラスメソッド accessInstanceVariablesDirectlyYES を返した場合、名前が _<key>_is<Key><Key>is<Key> に一致するインスタンス変数が、この順序で探されます。
  3. 一致するアクセッサかインスタンス変数があった場合、値を設定するのに使われます。必要ならば、「データをオブジェクトで表す」で議論されたように、オブジェクトから値が展開されます。
  4. 適切なアクセッサかインスタント変数が見つからなかった場合、setValue:forUndefinedKey: が呼び出されます。

メソッド takeStoredValue:forKey:setValue:forKey: に似ていますが、public のアクッセサよりもインスタンス変数への直接的なアクセスを使います。結果として、検索順序は 2、1、3、4 になります。

valueForKey: のデフォルトの検索パス

プロパティに対して value:forKey: のデフォルトの実装が呼び出されると、次の検索パターンが使われます:

  1. 受け手のクラスで、名前が -get<Key>-<Key>-is<Key> に一致するアクセッサメソッドが、この順序で探されます。
  2. アクセッサが見つからず、受け手のクラスメソッド accessInstanceVariablesDirectlyYES を返した場合、名前が _<key>_is<Key><Key>is<Key> に一致するインスタンス変数が、この順序で探されます。
  3. 一致するアクセッサかインスタンス変数があった場合、得られた値が返されます。必要ならば、「データをオブジェクトで表す」で議論されたように、いったんオブジェクトとしてカプセル化されます。
  4. 適切なアクセッサかインスタント変数が見つからなかった場合、valueForUndefinedKey: が呼び出され、値が返されます。

メソッド storedValue:forKey:value:forKey: に似ていますが、public のアクッセサよりもインスタンス変数への直接的なアクセスを使います。結果として、検索順序は 2、1、3、4 になります。

Mac OS X 10.3 での互換性の注意

Mac OS X 10.3 では、いくつかの存在していたキー・バリュー・コーディングメソッドを非推奨にしています。それらは、似たような機能を持つメソッドで置き換えられます。

表 8-1 Mac OS X 10.3 で非推奨なキー・バリュー・コーディングメソッド

Deprecated methodReplacement method
handleQueryWithUnboundKey:valueForUndefinedKey:
ahndleTakeValue:forUnboundKey:setValue:forUndefinedKey:
takeValue:forKey:setValue:forKey:
takeValue:forKeyPath:setValue:forKeyPath:
takeValuesFromDictionary:setValuesForKeysWithDictionary:
unableToSetNilForKey:setNilValueForKey:
valuesForKey:dictionaryWithValuesForKeys:

次の互換性に関する注意は、「setValue:forKey: のデフォルトの検索パス」と「valueForKey: のデフォルトの検索パス」でのアクセッサの検索パターンの議論から明らかです。

  • takeValue:forKey: とのバイナリの下位互換のために、名前が -_set<Key> と一致するメソッドも、ステップ 1 で認識されます。アンダースコアで始まるキー・バリュー・コーディングのアクセッサメソッドは、Mac OS X 10.3 では非推奨です。
  • バイナリの下位互換のために、受け手の unableToSetNilForKey: の実装が NSOjbect の実装ではない場合、ステップ 1 では setNilValueForKey: の代わりに unableToSetNilForKey: が呼ばれます。
  • ステップ 2 の挙動は、takeValue:forKey: とは違います。前は、インスタンス変数の検索順序は <key>_<key> でした。
  • takeValue:forKey: の挙動とバイナリの下位互換を取るために、受け手の handleTakeValue:forUnboundKey: の実装が NSObject の実装ではない場合、ステップ 4 で setValue:forUndefinedKey: の代わりに handleTakeValue:forUnboundKey: が呼び出されます。


[Home] [Download] [Archives] [BBS] [Cocoa Programming Tips 1001] [Core Foundation の秘密] [Safari Developer Center] [はじめてのブラウザのつくり方] [Sketch BP] [スクリーンセイバーを作ろう] [Objective-C 最適化] [Authorization API 完全理解] [Mac OS X Programming Books Review] [オブジェクト指向の言語比較論] [panther-dev]

mailto: mkino@xd5.so-net.ne.jp