代码之家  ›  专栏  ›  技术社区  ›  Thanks

在哪些情况下,对象不符合键值编码?

  •  3
  • Thanks  · 技术社区  · 16 年前

    目前,我正在学习有关键值编码的所有知识。

    在文件中他们说:

    关键路径序列中的任何对象 这不符合键值编码 对于相应的键,接收一个 未定义项的值:消息。

    我试着想象一种情况,一个对象不符合键值编码。怎么会这样?当我将一个uiview子类化时,它显然是兼容的,对吧?但当我用nsObject作为超类创建自己的对象时,这是怎么回事?当我创建一个没有超类的类时,那么确定这不符合K-V吗?

    2 回复  |  直到 16 年前
        1
  •  8
  •   Chuck    16 年前

    如果你仔细阅读,你会看到上面写着“键值编码兼容” 对于相应的键 “。这意味着,基本上,对于您请求的密钥,您没有合适的KVC方法。所以如果我这样做的话 [[NSString stringWithString:@"foo"] valueForKey:@"dippingSauce"] ,它会落到 valueForUndefinedKey: 因为nsstring对于密钥“dippingauce”不符合kvc,所以它没有 dippingSauce 实例方法或 蘸酱 伊瓦尔

        2
  •  4
  •   Louis Gerbarg    16 年前

    它说“这不符合键值编码 对于相应的键 “那是什么意思?

    @interface MyObject : NSObject {
      NSString *foo;
      NSString *bar;
    }
    
    @property (nonatomic, retain) NSString *foo;
    @property (nonatomic, retain) NSString *bar;
    
    @end
    
    @interface MyObject
    
    @synthesize foo;
    @synthesize bar;
    
    @end
    

    符合“foo”和“bar”,但不符合“baz”。

    对于简单的属性,默认情况下,所有nsObject子类都实现基本的kvc。收藏越来越复杂。为了使kvc能够正确地用于集合(因此您可以执行以下操作:

    NSArray *people = ... ;
    NSArray *firstNames = [people valueForKey:@"firstName"];
    

    它要求您实现某些额外的方法。一般来说,该功能的最大用户是cocoa绑定(iPhone上不提供),它是从coredata(无论如何,coredata都会自动生成额外的收集方法)中获取的,因此它仍然基本上是自动处理的。一般来说,人们不会费心在对象中实现对字典或数组的完全KVC支持,除非他们打算实际公开它们。你可以 read 关于KVC指南中的合规性。