1

いくつかの背景:

次のような、contentViewという名前のアウトレットを使用してUIScrollView派生クラスを作成しました。

@interface MyScrollView : UIScrollView {
    IBOutlet UIView * contentView;
}

...

@end

私のアウトレットは、この場合はiVarであり、プロパティではありません。私はInterfaceBuilderでクラスを利用し、ビューをcontentViewアウトレットに接続しました。ただし、実行時に、iVarがまだnilであり、目的のビューオブジェクトに設定されていないことを発見しました。

いくつかの実験により、アウトレットの名前を変更したり、アウトレットをiVarではなくプロパティにした場合、すべてが正常に機能することが明らかになりました。さらなる調査によると、私のアウトレットをという名前のiVarとして、contentViewnibをロードすると、実際には、目的のビューオブジェクトが。という名前のUIScrollViewのプライベートiVarに接続され_contentViewます。

ペン先の読み込みではKVCを使用して値を設定し、KVCsetValue:forKey:メソッドでは次のいずれかを使用して値を設定することを知っています。

  • set{Key}:方法
  • {key}iVar
  • _{key}iVar

set{Key}:メソッドを見つけようとする試みが最初に行われ、それが失敗した場合は、次に{key}または_{key}iVarを見つけるためにiVarの列挙が行われると思いますが、証明することはできません。この列挙は、おそらく、サブクラスの前にスーパークラスからiVarを処理する順序で発生します。

上記の候補者が試みられる文書化された順序はありますか?サブクラスに関連して、スーパークラスのメンバーはどのような順序で試行されますか?

4

1 に答える 1

1

特定の検索アルゴリズムは、Key-Valueコーディングプログラミングガイドに記載されています。

于 2012-08-04T00:15:23.787 に答える