KVC - 带点分隔的键值编码 - 异常不符合KVC

时间:2017-10-30 06:50:56

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

@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

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

2 个答案:

答案 0 :(得分:3)

方法valueForKey:采用单个键(属性或局部变量)名称,它不采用密钥路径,例如arr.count

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

然而,由于为NSArray定义valueForKey:的方式,您的示例仍然无效:

  

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

因此,如果您尝试valueForKeyPath:@"arr.count",则路径的arr部分将返回您的数组,然后NSArray的{​​{1}}将尝试获取valueForKey: {1}}数组的每个元素的键和数组本身的不是。不是你想要的......

这将我们带到Collection Operators,它提供了对您的集合中的集合,数组进行操作的关键路径,而不是其元素。您需要的收集运算符count为您提供关键路径@count,因此您需要致电:

arr.@count

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

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

没有尝试将temp.arr.count 应用于数组元素的问题,并返回count值而不是NSUInteger实例。

HTH

答案 1 :(得分:1)

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

  

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