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
部分将返回您的数组,然后NSArray
的valueForKey:
将尝试为每个获取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 的异常的主要内容,如果未能解决你的问题,请参考以下文章