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

Posted

技术标签:

【中文标题】KVC - 带点分隔的键值编码 - 不符合 KVC 的异常【英文标题】:KVC - key value coding with dot seperation - Exception not KVC compliant 【发布时间】: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

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

【问题讨论】:

【参考方案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: 消息。

【讨论】:

谢谢,我明白了。

以上是关于KVC - 带点分隔的键值编码 - 不符合 KVC 的异常的主要内容,如果未能解决你的问题,请参考以下文章

KVC与KVO

重点 : KVC/KVO

iOS底层学习——KVC

iOS开发底层之KVC了解 - 16

iOS开发底层之KVC了解 - 16

iOS开发底层之KVC了解 - 16