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

时间:2010-12-30 09:21:32

标签: objective-c json ios4

在此代码中:

- (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

3 个答案:

答案 0 :(得分:2)

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

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


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

}

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

答案 1 :(得分:1)

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

我不熟悉SBJSonParser,但我认为您操作的大部分内容都返回为NSDictionary,哪些特定字段作为更详细的类型返回(例如字符串为{{1} }})。

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

举例来说,我已经提取了一小段代码。

length

答案 2 :(得分:0)

希望这对某人有帮助。

这不是代码答案,但我收到了确切的错误消息,并通过以下方式修复了问题:

* 1-清理构建文件夹

* 2-清除派生数据

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

就我而言,我在不同的分支上添加了一堆框架。当我切换分支机构时,我需要彻底清除该项目。