为什么我的iOS应用程序崩溃了JSON?

时间:2014-05-20 15:55:11

标签: ios objective-c json

我正在尝试从更高的范围访问Objective-C中的JSON。但它一直在崩溃,我不明白为什么。

以下代码有效:

- (void)fetchedData:(NSData *)responseData {
    NSError* error;
    NSDictionary* json = [NSJSONSerialization
                          JSONOnkectWithData: responseData

                          options:kNilOptions
                          error:&error];

    NSArray* nameAndPlace = [[json objectForKey:@"objects"] objectForKey:@"havens"];
    //NSArray* productArray = [[json objectForKey:@"objects"] objectForKey:@"products"];

    NSLog(@"FROM ---> %@", nameAndPlace);

    for (NSDictionary *mapPointLoop in nameAndPlace) {
        NSString * name = [mapPointLoop objectForKey:@"name"];
        NSString * longitudeGet = [mapPointLoop objectForKey:@"longitude"];
        NSString * latitudeGet = [mapPointLoop objectForKey:@"latitude"];

        myAnnotation *annotation1 = [[myAnnotation alloc] init];

        CLLocationCoordinate2D coordinate1;
        coordinate1.longitude = longitude;
        coordinate1.latitude = latitude;
        annotation1.coordinate = coordinate1;

        annotation1.title = name;

        [mainMap addAnnotation:annotation1];

        //NSLog(@"FROM ---> %@", mapPointLoop);
    }
}

但是当我使用它时它会崩溃:

- (void)fetchedData:(NSData *)responseData {

    NSError* error;
    NSDictionary* json = [NSJSONSerialization
                          JSONObjectWithData:responseData

                          options:kNilOptions
                          error:&error];

    NSArray* nameAndPlace = [json objectForKey:@"objects"];
    //NSArray* productArray = [[json objectForKey:@"objects"] objectForKey:@"products"];

    NSLog(@"FROM -> %@", nameAndP1ace);

    for (NSDictionary *mapPointLoop in nameAndPlace) {
        NSString * name = [[mapPointLoop objectForKey:@"havens"] objectForKey:@"name"];
        NSNumber * longitudeGet = [mapPointLoop objectForKey:@"longitude"];
        NSNumber * latitudeGet = [mapPointLoop objectForKey:@"latitude"];

        float latitude = [latitudeGet floatvalue];
        float longitude = [longitudeGet floatvalue];

        myAnnotation *annotation1 = [[myAnnotation alloc] init];

        CLLocationCoordinate2D coordinate1;
        coordinate1.longitude = longitude;
        coordinate1.latitude = latitude;
        annotation1.coordinate = coordinate1

        annotation1.title = name;

        [mainMap addAnnotation:annotation1];

        //NSLog(@"FROM -> %@", mapPointLoop):
    }
}

它因错误而崩溃......

  

2014-05-20 17:49:57.709 labelAPortTest [5556:60b] * 终止应用   由于未捕获的异常'NSInvalidArgumentException',原因:   ' - [__ NSCFString objectForKey:]:发送到实例的无法识别的选择器   0x1172426b0'

2 个答案:

答案 0 :(得分:3)

崩溃是因为当你取名字时:

NSString *name = [[mapPointLoop objectForKey:@"havnes"] objectForKey:@"name"];

这样:

[mapPointLoop objectForKey:@"havens"]

NSArray,而不是NSDictionary,密钥为name

事实上,在您的第一个代码中,您可以使用objectForKey:@"objects"] objectForKey:@"havens]" 所以你有这种情况:

NSDictionary〜> 对象 〜> NSDictionary〜> 避风港 〜> NSArrayNSDictionary

然后你会经历一个for循环,在NSDictionary中获得NSArray的1比1。

第二种情况(崩溃):

NSDictionary〜> 对象 〜> NSDictionary

但是你正在NSArray再次使用for循环... NSDictionary

答案 1 :(得分:0)

  

但它一直在崩溃,我不明白为什么。

原因就在这里:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString objectForKey:]: unrecognized selector sent to instance 0x1172426b0'

你有一个未被捕获的例外。此外,您有一些关于该异常的信息,即您将objectForKey:消息发送给未实现它的对象。

您应该做的第一件事是为所有例外设置断点:

setting an exception breakpoint

这会导致调试器在抛出异常后立即停止,而不是等到应用程序退出,这将为您提供更多的上下文。您应该能够看到哪个对象正在获取未知消息。如果这不能完全解决问题,请在异常发生之前将断点设置为一行或两行,并一次一行地执行代码,直到找到问题为止。