Ios 我的代码正在引发无法识别的选择器发送的异常

Ios 我的代码正在引发无法识别的选择器发送的异常,ios,nsstring,sbjson,Ios,Nsstring,Sbjson,这是我用来通过SBJson解析获取字符串的代码: NSMutableArray *abc=[jsonData valueForKey:@"items"]; NSString *imgStr=(NSString *)[abc valueForKey:@"image"]; NSLog(@"%@",imgStr); 这里的abc是NSMutableArray 它抛出的例外是 > -[__NSArrayI stringByReplacingOccurrencesOfString:withStr

这是我用来通过SBJson解析获取字符串的代码:

NSMutableArray *abc=[jsonData valueForKey:@"items"];

NSString *imgStr=(NSString *)[abc valueForKey:@"image"];
NSLog(@"%@",imgStr);
这里的abc是
NSMutableArray

它抛出的例外是

> -[__NSArrayI stringByReplacingOccurrencesOfString:withString:]: unrecognized selector sent to instance

在第一行中,您将
abc
声明为
NSMutableArray

在第二行中,您尝试将其作为
NSDictionary
访问

在您的情况下(我在这里猜测),我希望您有一个项目数组,每个项目都是一个带有“image”键的字典

因此,为了得到您的第一件物品,您可能会使用

  NSDictionary* firstItem = [abc objectAtIndex:0];
然后,您可以从中提取图像:

NSString*imgStr=(NSString*)[firstItem valueForKey:@“image”];一,


1请参见@Stig

中的注释,您将
abc
声明为
NSMutableArray

在第二行中,您尝试将其作为
NSDictionary
访问

在您的情况下(我在这里猜测),我希望您有一个项目数组,每个项目都是一个带有“image”键的字典

因此,为了得到您的第一件物品,您可能会使用

  NSDictionary* firstItem = [abc objectAtIndex:0];
然后,您可以从中提取图像:

NSString*imgStr=(NSString*)[firstItem valueForKey:@“image”];一,


1请参阅@Stig的评论,您的代码有几个问题:

  • 对于NSArray,
    valueForKey:
    返回另一个数组。它不会返回NSString,无论您的类型如何。您需要获取对数组中第一个条目的引用,然后调用
    objectForKey:

  • 您正在使用NSKeyValueCoding方法
    valueForKey:
    ,您可能打算使用NSDictionary方法
    objectForKey:
    。对于字典来说,它们基本上是可互换的,但是如果您使用
    objectForKey:
    ,您将得到一个很容易理解的错误,即无法在数组上调用
    objectForKey:
    仅当确实需要键值编码语义时才使用
    valueForKey:

  • 您几乎不需要在Objective-C中强制转换
    id
    。这样只会隐藏错误。(在本例中,它可能隐藏您的问题,也可能不隐藏您的问题,但它肯定更丑陋、更不正确(因为您试图将数组转换为字符串),并且只是愚弄您,使您以为您拥有一个字符串,因为转换没有失败。)

  • 你可能想写这样的东西:

    NSArray *abc = [jsonData valueForKey:@"items"];
    NSDictionary *entry = [abc objectAtIndex:0];    
    NSString *imgStr = [entry objectForKey:@"image"];
    NSLog(@"%@", imgStr);
    

    您的代码有几个问题:

  • 对于NSArray,
    valueForKey:
    返回另一个数组。它不会返回NSString,无论您的类型如何。您需要获取对数组中第一个条目的引用,然后调用
    objectForKey:

  • 您正在使用NSKeyValueCoding方法
    valueForKey:
    ,您可能打算使用NSDictionary方法
    objectForKey:
    。对于字典来说,它们基本上是可互换的,但是如果您使用
    objectForKey:
    ,您将得到一个很容易理解的错误,即无法在数组上调用
    objectForKey:
    仅当确实需要键值编码语义时才使用
    valueForKey:

  • 您几乎不需要在Objective-C中强制转换
    id
    。这样只会隐藏错误。(在本例中,它可能隐藏您的问题,也可能不隐藏您的问题,但它肯定更丑陋、更不正确(因为您试图将数组转换为字符串),并且只是愚弄您,使您以为您拥有一个字符串,因为转换没有失败。)

  • 你可能想写这样的东西:

    NSArray *abc = [jsonData valueForKey:@"items"];
    NSDictionary *entry = [abc objectAtIndex:0];    
    NSString *imgStr = [entry objectForKey:@"image"];
    NSLog(@"%@", imgStr);
    

    哦我不知道,你能告诉我如何访问NSMutableArray吗@HeWas@Atul,请参阅我的扩展答案,不要使用
    valueForKey:
    给出建议。这是错误的方法。学习使用
    objectForKey:
    这是OP想要的方法。@Stigbrautset-更正,谢谢。我总是使用objectForKey——但我试图让代码的其余部分保持原样,以便Atul能够专注于给他带来错误的问题。@HeWas优秀。我这么说的原因是,如果OP使用了正确的方法,他可能一开始就不会感到困惑,因为错误会更加明显。哦!我不知道,你能告诉我如何访问NSMutableArray吗@HeWas@Atul,请参阅我的扩展答案,不要使用
    valueForKey:
    给出建议。这是错误的方法。学习使用
    objectForKey:
    这是OP想要的方法。@Stigbrautset-更正,谢谢。我总是使用objectForKey——但我试图让代码的其余部分保持原样,以便Atul能够专注于给他带来错误的问题。@HeWas优秀。我这么说的原因是,如果OP使用了正确的方法,他一开始可能不会感到困惑,因为错误会更加明显。请显示您的JSON。并添加一个
    NSLog(@“%@”,abc)行,并显示崩溃前的输出。我怀疑abc不是你想象的那样。这是我的控制台中abc的NSLog
    2013-01-24 16:14:06.535 Drase[1381:11303]({gamepoint=20;gid=365;image=“ivborw0kggksjallajlajlajlajlajlajlajlajlajlajldal”;level=1;movie=“”;status=pending;uid=13;})
    图像很短,因为它没有出现在注释中。请显示您的JSON。并添加一个
    NSLog(@“%@”,abc)行,并显示崩溃前的输出。我怀疑abc不是你想象的那样。这是我的控制台中abc的NSLog
    2013-01-24 16:14:06.535 Drase[1381:11303]({gamepoint=20;gid=365;image=“ivborw0kggksjallajlajlajlajlajlajlajlajlajlajldal”;level=1;movie=“”;status=pending;uid=13;})
    图像很短,因为它没有出现在注释中