【问题标题】:KVC - key value coding with dot seperation - Exception not KVC compliantKVC - 带点分隔的键值编码 - 不符合 KVC 的异常
【发布时间】:2017-10-30 06:50:56
【问题描述】:
@interface MyClass: NSObject
@property NSArray *arr;
@end
@inplementation MyClass
- (instancetype) init
{
    if(self = [super init])
    {
        self.arr = [[NSArray alloc] init];
    }
    return self;
}
@end
int main(int argc, char *argv[])
{
    MyClass *temp = [[MyClass alloc] init];
    [temp valueForKey:@"arr.count"];    //count is ivar of NSArray
    return 0;
}

然后控制台说

NSExceptions: [MyClass valueForUnfinedKey:] 这个类不是键 键 arr.count 的值投诉

每次我使用点分隔符时,都会出现这个exceptions

我尝试搜索网页并阅读菜单,但我仍然不知道为什么,有人可以帮忙吗?谢谢。

【问题讨论】:

    标签: ios objective-c cocoa-touch key-value-coding kvc


    【解决方案1】:

    valueForKey: 方法采用单个键(属性或局部变量)名称,它不采用诸如 arr.count 之类的键路径。

    valueForKeyPath: 方法确实采用了一个关键路径,它实际上是一系列valueForKey: 调用。请参阅About Key-Value Coding 中的使用键获取属性值

    但是由于valueForKey: 是为NSArray 定义的方式,您的示例仍然无法工作:

    返回一个数组,其中包含调用 valueForKey 的结果:在数组的每个对象上使用键。

    因此,如果您尝试valueForKeyPath:@"arr.count",则路径的arr 部分将返回您的数组,然后NSArrayvalueForKey: 将尝试为每个获取count数组的元素not 数组本身。不是你想要的……

    这将我们带到Collection Operators,它提供了对集合、数组进行操作的关键路径,在您的情况下是数组,而不是它的元素。你需要的集合操作符是@count给你的关键路径arr.@count,所以你需要调用:

    [temp valueForKeyPath:@"arr.@count"]
    

    除非这是学习 KVC 的练习,否则可以缩短为:

    temp.arr.count
    

    不存在尝试将count 应用于数组元素的问题,并返回NSUInteger 值而不是NSNumber 实例。

    HTH

    【讨论】:

    • 谢谢你,起初我什至不知道 valueForKey: 和 valueForKeyPath: 之间的区别,并认为它们是相同的,我尝试使用 valueForKeyPath: 但由于我忘记它是集合而失败目的。这确实有帮助:)
    【解决方案2】:

    这是因为arr.count 不是 MyClass 的键值投诉。程序运行时,找不到 MyClass 名称arr.count 的任何属性。

    valueForKeyPath: - 返回指定键路径相对于接收者的值。键路径序列中不符合特定键的键值编码的任何对象(即 valueForKey: 的默认实现找不到访问器方法的对象)都会收到 valueForUndefinedKey: 消息。

    【讨论】:

    • 谢谢,我明白了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多