代码之家  ›  专栏  ›  技术社区  ›  netdigger

以两种不同的方式通过字符串访问NSMutableDictionary时崩溃?[已关闭]

  •  -1
  • netdigger  · 技术社区  · 13 年前

    我有以下方法:

    -(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 回复  |  直到 13 年前
        1
  •  3
  •   Bryan Chen    13 年前

    错误为:

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

    这意味着 fid 是一个 NSNumber NSString

    此外,您应该使用 objectForKey: 相当地 valueForKey: 从字典中获取对象

    所以试试这个

    [self.nFlist valueForKey:[fid stringValue]]
    
        2
  •  0
  •   DonnaLea    13 年前

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

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

    NSDictionary Class Reference

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