1

一些背景:

我写了一个 UIScrollView 派生类,它有一个名为 contentView 的 outlet,类似于以下内容:

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

...

@end

在这种情况下,我的出口是 iVar,而不是财产。我在 Interface builder 中使用了我的类并将视图连接到contentView插座。然而,在运行时,我发现我的 iVar 仍然是 nil 并且没有设置为所需的视图对象。

一些实验表明,如果我重命名插座或将插座设为属性而不是 iVar,一切都会正常工作。进一步的研究表明,使用我的插座作为名为 的 iVar contentView,加载 nib 实际上会将我想要的视图对象连接到 UIScrollView 中名为 的私有 iVar _contentView

我知道 nib 加载使用 KVC 设置值,并且 KVCsetValue:forKey:方法将使用以下任何一种设置值:

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

我怀疑但无法证明set{Key}:首先尝试找到该方法,如果失败,则进行 iVar 的枚举以找到下一个{key}_{key}iVar。此枚举可能以从超类在子类之前处理 iVar 的顺序发生。

是否有记录上述候选人的顺序?与子类相关的超类成员的尝试顺序是什么?

4

1 回答 1

1

具体的搜索算法记录在Key-Value Coding Programming Guide中。

于 2012-08-04T00:15:23.787 回答