我的代码抛出了Exception Unrecognized选择器

时间:2013-01-24 08:25:54

标签: ios nsstring sbjson

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

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

NSString *imgStr=(NSString *)[abc valueForKey:@"image"];
NSLog(@"%@",imgStr);

这里abc是NSMutableArray

它抛出的异常是

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

2 个答案:

答案 0 :(得分:4)

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

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

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

所以要获得你可以使用的第一个项目

  NSDictionary* firstItem = [abc objectAtIndex:0];

然后你可以从中提取你的图像:

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

 NSString *imgStr = [abc objectForKey:@"image"];

1 见@Stig的评论

答案 1 :(得分:0)

您的代码有几个问题:

  1. 对于NSArray,valueForKey:返回另一个数组。无论你的演员表是什么,都会返回NSString。您需要获取对数组中第一个条目的引用,然后在其上调用objectForKey:

  2. 您正在使用NSKeyValueCoding方法valueForKey:,您可能打算使用NSDictionary方法objectForKey:。对于词典,它们大致可以互换,但是如果你使用objectForKey:,你就会有一个容易理解的错误,即无法在数组上调用objectForKey:仅在您真正需要键值编码语义时才使用valueForKey:

  3. 您几乎从不需要在Objective-C中投射id。你只是以这种方式隐藏错误。 (它可能会或可能不会隐藏你的问题在这个例子中,但它肯定是丑陋的,不正确的(因为你试图将数组转换为字符串)并且只是愚弄你以为你有一个字符串,因为演员没有失败。)

  4. 你可能想写这样的东西:

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