【问题标题】:In which situations would an object not be key-value coding compliant?在哪些情况下对象不符合键值编码?
【发布时间】:2009-07-22 08:23:20
【问题描述】:

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

在他们说的文档中:

键路径序列中的任何对象 不符合键值编码 对于适当的键接收 valueForUndefinedKey: 消息。

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

【问题讨论】:

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


    【解决方案1】:

    如果你仔细阅读,你会看到它说“key-value codingcompliant for the appropriate key”。基本上,这意味着您没有针对您要求的密钥的适当 KVC 方法。因此,如果我执行[[NSString stringWithString:@"foo"] valueForKey:@"dippingSauce"],它将落入valueForUndefinedKey:,因为对于键“dippingSauce”,NSString 不符合 KVC 标准——它没有dippingSauce 实例方法或dippingSauce ivar。

    【讨论】:

    • 我明白了 :) 所以整个 KVC 合规性内容并不绑定到整个类,而是绑定到每个实例变量或属性。不错
    • +1 用于在编程示例中成功使用“dippingSauce”。
    【解决方案2】:

    它说“对于适当的键,它不符合键值编码。”这意味着

    @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 支持,除非他们打算实际公开它们。您可以在 KVC 指南中read 了解合规性。

    【讨论】:

    • 还需要什么额外的方法?只要people 中的所有对象都响应firstName,这应该可以工作。
    • 好的,如果我不为实例变量创建属性,即不创建 getter/setter,我无法通过 KVC 访问它?
    • Chuck:对不起,这个例子实际上可以工作,但是一些更复杂的使用,比如@distinctUnionOfSets 等可能会有问题。谢谢:不,KVC 合规性不需要属性,它们只是一般的东西,因为它们让你表达对象的内存语义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    相关资源
    最近更新 更多