__NSCFConstantString objectForKey未识别的选择器发送到实例错误

3
我基本上遇到了这个错误。
'NSInvalidArgumentException', reason: '-[__NSCFConstantString objectForKey:]: unrecognized selector sent to instance 0x581f0'

在我的程序中,我认为它指的是我所做的这个调用。
if (data != nil) {
    if([data objectForKey:@"username"]){
       // NSArray *check= [[NSArray alloc]init];
        //check=[data allValues];
        [dict setObject:[data allValues] forKey:@"args"];

    }else{
    [dict setObject:[NSArray arrayWithObject:data] forKey:@"args"];
}

在 setObject:[data allValues] 中,我不知道为什么会出现错误,但 data 是一个 NSDictionary,我正在获取所有的值并将其放入数组中。


1
在 "if (data != nil)" 之后,记录 [data class] 并查看其结果。 - rdelmar
@rdelmar 谢谢你的提示。它显示了问题。起初它返回NSMutableDictionary,然后是字符串。所以我的问题现在是,是否有一种方法来检查某个东西是否是NSDictionary? - Michael Nana
1
如果([data isKindOfClass:[NSDictionary class]])呢? - rdelmar
@rdelmar 谢谢,伙计。我已经在网上找到了,但还是谢谢你。 - Michael Nana
似乎这是一个设计缺陷,你正在使用NSString调用该方法,而应该使用NSDictionary。 - Richard
1个回答

3

错误是发生在这里吗:

    if([data objectForKey:@"username"]){

我认为是这样,因为只有在这个地方才会调用objectForKey。你正在对一个名为“ data”的变量调用它,我猜想它不是一个字典。您应该NSLog类型以查看。

@darren 是的,它首先返回了一个_NSDictionaryM,然后是一个字符串。这实际上回到了我最初想要的东西。有没有一种方法可以检查你正在使用的值是一个NSDictionary? - Michael Nana
有办法可以检查,但你的情况听起来像是一个恶心的内存问题(如果我理解正确的话)。你是说有时候当你登录时会得到一个字典,有时候会得到一个字符串吗?这种类型的错误有时意味着过度释放了一个对象(你是否在使用ARC?)。运行时正在释放你原来的字典,并使用那个旧空间来放置一个新的字符串对象。 - D.C.
如果你真的想检查 'data' 的类型,你可以这样做:if ([data isKindOfClass:[NSDictionary class]]) - D.C.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接