@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
。
我试图搜索网页和阅读菜单,我仍然不知道为什么,有人可以帮忙吗?感谢。
答案 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:消息。