目前,我正在学习关键值编码的所有内容。
他们在文档中说:
密钥路径序列中的任何对象 这不符合键值编码 为适当的密钥收到一个 valueForUndefinedKey:message。
我试图想象一个对象不符合键值编码的情况。怎么会发生这种情况?当我将UIView子类化时,这显然是合规的,对吧?但是当我用NSObject作为超类创建自己的对象时,那是怎么回事?当我创建一个没有超类的类时,那么肯定这不符合k-v吗?
答案 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指南中的合规性。