以字符串形式访问NSMutableDictionary时出现崩溃,有两种不同的方式?

时间:2013-04-12 05:46:28

标签: ios objective-c nsstring nsmutabledictionary

我有以下方法:

-(QFFriend*)getFriendById:(NSString*)fid
{
    TFLog(@"NList %@", self.nFlist);
    TFLog(@":%@:%@:", @"3", fid);
    TFLog(@"%@", [self.nFlist valueForKey:@"3"]);
//    TFLog(@"%@", [self.nFlist valueForKey:fid]);
}

当我用评论运行它时,我得到了这个结果:(因为我遗漏了返回而崩溃)

2013-04-12 07:39:49:972 QF[42881:2311] NList {
    2 = "<QFFriend: 0x1dd61970>";
    3 = "<QFFriend: 0x1dd76570>";
    4 = "<QFFriend: 0x1dd84a70>";
    7 = "<QFFriend: 0x1dd70760>";
}
2013-04-12 07:39:49:974 QF[42881:2311] :3:3:
2013-04-12 07:39:49:976 QF[42881:2311] <QFFriend: 0x1dd76570>

然而,如果我取消注释该行,我会再次崩溃,有人可以解释可能出现的问题吗?

2013-04-12 07:43:28:736 QuizFuzz[42912:2311] NList {
    2 = "<QFFriend: 0x1c5888c0>";
    3 = "<QFFriend: 0x1c5a5c30>";
    4 = "<QFFriend: 0x1c5acaf0>";
    7 = "<QFFriend: 0x1c5badf0>";
}
2013-04-12 07:43:28:738 QF[42912:2311] :3:3:
2013-04-12 07:43:28:740 QF[42912:2311] <QFFriend: 0x1c5a5c30>
2013-04-12 07:43:28.741 QF[42912:907] -[__NSCFNumber length]: unrecognized selector sent to instance 0x1d8521b0
2013-04-12 07:43:28:754 QF[42912:2311] ERROR: -[__NSCFNumber length]: unrecognized selector sent to instance 0x1d8521b0
2013-04-12 07:43:28.756 QF[42912:907] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber length]: unrecognized selector sent to instance 0x1d8521b0'

两个最后一次通话怎么能不相同?我在两种情况下都发了一个字符串!

2 个答案:

答案 0 :(得分:3)

错误是:

  

- [__ NSCFNumber length]:无法识别的选择器发送到实例

表示fidNSNumber而不是NSString

另外,您应该使用objectForKey:而不是valueForKey:来从字典中获取对象

所以试试这个

[self.nFlist valueForKey:[fid stringValue]]

答案 1 :(得分:0)

我不确定为什么在使用看似非常相似的代码时会遇到两次不同的崩溃。但是如果你想修复崩溃,我相信你正在寻找的电话是:

[self.nFlist objectForKey:@"3"];

NSDictionary Class Reference

/ * update * / 实际上,在阅读了更多崩溃日志并查看TFLog之后。我猜想传入的fid对象是一个NSNumber,而不是你期望的NSString。要确认这一点,您可以注销:TFLog(@"fid.class: %@", fid.class);这会记录课程,而不是描述,这样您就可以看到自己拥有的内容。值为3的NSNumber和值为“3”的NSString都会以3注销。