2010-04-03 41 views
2
arr = [[NSMutableArray alloc]init]; 
[arr addObject:[NSNumber numberWithInt:4]]; 
[arr addObject:[NSNumber numberWithInt:45]]; 
[arr addObject:[NSNumber numberWithInt:23]]; 
[arr addObject:[NSNumber numberWithInt:12]]; 
NSLog(@"The avg = %@", [arr valueForKeyPath:@"@avg.intValue"]); 

此代码工作正常,但为什么? valueForKeyPath:@"@avg.intValue"正在从每个NSNumber请求(int),但我们正在日志中输出%@字符串。如果我尝试输出一个十进制%d我得到一个数字,可能是一些指针。有人可以解释为什么当我调用@avg操作符时整数变成NSNumbers?客观c关键路径运营商@ avg,@ max

回答

1

valueForKeyPath:必须返回一个对象(其返回类型为id),所以你得到一个NSNumber或NSValue(我不知道它,这取决于是否intValue给出了一个int或NSNumber的,并且(如果是前者)尽管有intValue,结果如何捆绑回到对象中)。这与您无法在集合中存储非对象的原因是一样的。

1

@avg运算符返回一个NSNumber实例。如果使用%d,则将打印NSNumber实例的内存地址。另一方面,当您使用%@时,将发送NSNumber实例的消息,并打印生成的NSString

有关@avg和其他运营商的更多信息,请参阅Set and Array OperatorsKey-Value Coding Programming Guide