[NSCFString objectForKey:]:发送到实例的无法识别的选择器

Posted

技术标签:

【中文标题】[NSCFString objectForKey:]:发送到实例的无法识别的选择器【英文标题】:[NSCFString objectForKey:]: unrecognized selector sent to instance 【发布时间】:2010-12-30 09:21:31 【问题描述】:

在这段代码中:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection       

//---initialize the array--- 
listOfJMovies = [[NSMutableArray alloc] init];
listOfJMoviePosters = [[NSMutableArray alloc] init];
tmdbMovies = [[NSArray alloc] init];
posters = [[NSArray alloc] init];
thumbs = [[NSArray alloc] init];

//---set the title--- 
self.navigationItem.title = @"Movies";

NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

//NSLog(responseString);

SBJsonParser *json = [[SBJsonParser new] autorelease];
tmdbMovies = [json objectWithString:responseString error:nil];

for (id movie in tmdbMovies) 
    [listOfJMovies addObject:[movie objectForKey:@"name"]];
    NSLog(@"Name: %@", [movie objectForKey:@"name"]);
    //[listOfJMoviePosters addObject:[obj objectForKey:@"posters"]];
    //NSLog(@"%@", [obj objectForKey:@"posters"]);

    posters = [movie objectForKey:@"posters"];

    for (id image in posters) 
        NSLog(@"image: %@", [image objectForKey:@"image"]);
        thumbs = [image objectForKey:@"image"];

        for (id url in thumbs) 


            NSLog(@"Size: %@", [url objectForKey:@"size"]);

            //NSLog(@"blah");
            //[listOfJMoviePosters addObject:[url objectForKey:@"size"]];

        



    




[[self tableView] reloadData];

[responseString release];
[connection release];
[responseData release];



这一行:NSLog(@"Size: %@", [url objectForKey:@"size"]);

导致应用崩溃并抛出以下错误:

2010-12-30 00:33:29.730 FlixIt[33132:207] -[NSCFString objectForKey:]:无法识别的选择器发送到实例 0x4e50f00 2010-12-30 00:33:29.732 FlixIt[33132:207] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[NSCFString objectForKey:]:无法识别的选择器发送到实例 0x4e50f00 '

这是 JSON:http://api.themoviedb.org/2.1/Movie.browse/en-US/json/e5084159b962a8f0c39096f379a1363c?order_by=rating&order=desc&genres=18&min_votes=5&page=1&per_page=10

【问题讨论】:

【参考方案1】:

通过查看数据结构,在我看来你有一个额外的循环。在“海报”循环中尝试:

for (id image in posters) 
    NSLog(@"image: %@", [image objectForKey:@"image"]);
    thumbs = [image objectForKey:@"image"];


    NSLog(@"Size: %@", [thumbs objectForKey:@"size"]);


image 是一个字典,键“size”具有 NSString 类型。

【讨论】:

谢谢!这样可行。但是我收到以下警告:“NSArray”可能无法响应“-objectForKey:” 将 NSArray 更改为 NSDictionary,这似乎清除了警告。再次感谢!【参考方案2】:

看起来urlNSString 类型,它不响应objectForKey: 方法。换句话说,该方法不是由NSString 实现的。如果您知道您在 for 循环中所期望的对象的类型,那么如果您在声明中使用特定类型而不是 id,您将获得一些额外的编译器检查。

我不熟悉SBJSonParser,但我假设您正在操作的大部分内容都以NSDictionary 的形式返回,具体字段以更详细的类型返回(例如字符串为NSString)。

我还假设通过查询“大小”,您实际上是在寻找字符串的长度?在这种情况下,您需要使用 length 方法。如果这不是您想要做的,那么更多信息会很有用。

作为示例,我提取了您的一小段代码。

for (NSDictionary *image in posters) 
    NSLog(@"image: %@", [image objectForKey:@"image"]);
    thumbs = [image objectForKey:@"image"];

    for (NSString *url in thumbs) 
        NSLog(@"Size: %@", [url length]);

        //NSLog(@"blah");
        //[listOfJMoviePosters addObject:[url objectForKey:@"size"]];

    

【讨论】:

【参考方案3】:

希望这对某人有所帮助。

这不是代码答案,但我收到了这个确切的错误消息,我修复了它:

*1 - 清理构建文件夹

*2 - 清除派生数据

*3 - 删除模拟器和/或设备上的应用程序。

就我而言,我在不同的分支上添加了一堆框架。当我切换分支时,我需要对项目进行深入清理。

【讨论】:

以上是关于[NSCFString objectForKey:]:发送到实例的无法识别的选择器的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 应用程序崩溃 [__NSCFString objectForKey:] 无法识别的选择器发送到实例

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[NSCFString objectForKey:]:无法识别的选择器已发送到实例

JSONKit 返回不需要的 NSCFString 而不是 NSDictionary

Swift Userdefaults 将 String 转换为 __NSCFString

NSMutableDictionary 转换成 __ NSCFString

xcode中的NSString或NSCFString?