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

时间:2009-07-22 08:23:20

标签: iphone key-value-coding key-value

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

他们在文档中说:

  

密钥路径序列中的任何对象   这不符合键值编码   为适当的密钥收到一个   valueForUndefinedKey:message。

我试图想象一个对象不符合键值编码的情况。怎么会发生这种情况?当我将UIView子类化时,这显然是合规的,对吧?但是当我用NSObject作为超类创建自己的对象时,那是怎么回事?当我创建一个没有超类的类时,那么肯定这不符合k-v吗?

2 个答案:

答案 0 :(得分:8)

如果您仔细阅读,您会看到“适当的密钥符合键值编码”。这基本上意味着您没有适合您要求的密钥的KVC方法。因此,如果我执行[[NSString stringWithString:@"foo"] valueForKey:@"dippingSauce"],它将落到valueForUndefinedKey:,因为NSString与键“dippingSauce”不符合KVC - 它没有dippingSauce实例方法或{ {1}} ivar。

答案 1 :(得分:4)

它表示“对于适当的密钥,这不符合键值编码。”这意味着什么

@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"];

它要求您实现某些额外的方法。一般来说,该功能的最大用户是源自CoreData的Cocoa绑定(在iPhone上不可用)(无论如何自动生成其他收集方法),因此它通常仍然基本上自动处理。通常人们不打算在其对象中实现对字典或数组的完全KVC支持,除非他们打算实际暴露它们。您可read了解KVC指南中的合规性。