Ios 通过字符串以两种不同方式访问NSMutableDictionary时崩溃?

Ios 通过字符串以两种不同方式访问NSMutableDictionary时崩溃?,ios,objective-c,nsstring,nsmutabledictionary,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]); } 当我用注释运行它时,我得到以下结果:(崩溃是因为

我有以下方法:

-(QFFriend*)getFriendById:(NSString*)fid
{
    TFLog(@"NList %@", self.nFlist);
    TFLog(@":%@:%@:", @"3", fid);
    TFLog(@"%@", [self.nFlist valueForKey:@"3"]);
//    TFLog(@"%@", [self.nFlist valueForKey:fid]);
}
当我用注释运行它时,我得到以下结果:(崩溃是因为我忽略了返回)

2013-04-1207:39:49:972 QF[42881:2311]NList{
2 = "";
3 = "";
4 = "";
7 = "";
}
2013-04-12 07:39:49:974 QF[42881:2311]:3:3:
2013-04-12 07:39:49:976 QF[42881:2311]
然而,如果我取消注释这一行,我会再次崩溃,有人能解释一下可能的错误吗

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'
2013-04-1207:43:28:736 QuizFuzz[42912:2311]列表{
2 = "";
3 = "";
4 = "";
7 = "";
}
2013-04-12 07:43:28:738 QF[42912:2311]:3:3:
2013-04-12 07:43:28:740 QF[42912:2311]
2013-04-12 07:43:28.741 QF[42912:907]-[\uu NSCFNumber length]:发送到实例0x1d8521b0的无法识别的选择器
2013-04-12 07:43:28:754 QF[42912:2311]错误:-[\uu NSCFNumber length]:发送到实例0x1d8521b0的选择器无法识别
2013-04-12 07:43:28.756 QF[42912:907]***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[\uu NSCFNumber length]:未识别的选择器发送到实例0x1d8521b0”
最后两个调用怎么可能不相等?在这两种情况下,我都会发送一个字符串

错误是:

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

这意味着
fid
是一个
NSNumber
而不是
NSString

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

所以试试这个

[self.nFlist valueForKey:[fid stringValue]]

我不知道为什么在使用看起来非常相似的代码时会出现两种不同的崩溃。但是,如果你想解决撞车问题,我相信你要找的电话是:

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

/*更新*/
实际上,在阅读了更多的崩溃日志并查看了TFLogs之后。我猜传入的fid对象是NSNumber,而不是您期望的NSString。要确认这一点,您可以注销:
TFLog(@“fid.class:%@”,fid.class)这会记录类,而不是描述,因此您可以查看您拥有的内容
NSNumber
值为3和
NSString
值为@“3”都将以3的身份注销。

+1,但出于好奇,为什么要使用
description
而不是
stringValue
?谢谢。这太好笑了,我想不出来。我说“我从来没用过nsnumber!”,但耶,我用过。@lnafziger因为在写答案时我忘了有
stringValue
。。。谢谢你的指点
[self.nFlist objectForKey:@"3"];