2014-05-20 33 views
-3

我想從更高的範圍訪問Objective-C中的JSON。但它不斷崩潰,我不知道爲什麼。爲什麼我的iOS應用使用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年5月20日17:49:57.709 labelAPortTest [5556:60B] *終止應用程序 由於未捕獲的異常「N SInvalidArgumentException」,原因是: ' - [__ NSCFString objectForKey:]:無法識別的選擇發送到實例 0x1172426b0'

+2

發佈實際代碼比發佈代碼圖片更好。文本更易於閱讀,並且可以很容易地將它複製到帶有更正的答案中。 – Caleb

+0

任何包含單詞「無法識別的選擇器」的錯誤消息?展示下。向我們展示實際JSON的副本。 json變量的NSLog就足夠了。 – gnasher729

+0

這兩個代碼塊是不同的......我懷疑這是你得到nameAndPLace導致這個問題的戰爭。什麼是崩潰信息? – CW0007007

回答

3

它崩潰,因爲當你取的名字:

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

這樣的:

[mapPointLoop objectForKey:@"havens"] 

NSArray,而不是一個NSDictionary與關鍵name

事實上,在你的第一個代碼,你拿objectForKey:@"objects"] objectForKey:@"havens]" 所以你有這樣的情況:

NSDictionary〜>對象(的NSDictionary〜>NSDictionary〜>避風港〜>NSArray

然後你去通過爲週期在NSArray獲得1比1的NSDictionary

第二種情況(即崩潰):

NSDictionary〜>對象〜>NSDictionary

,但你是把在一個NSArray與再次去爲cycle..on的NSDictionary

0

但它總是崩潰,我不知道爲什麼。

的原因就在這裏:

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

您有一個未捕獲的異常。此外,還有一些關於該例外情況的信息,即您將objectForKey:消息發送給未實現該消息的對象。

你應該做的第一件事就是爲所有的異常斷點:

setting an exception breakpoint

這會導致調試儘快停止的異常被拋出,而不是等待,直到應用程序退出,這會給你更多的上下文。您應該能夠看到哪個對象獲取了未知消息。如果這不能使問題完全清楚,在發生異常之前將斷點設置爲一兩行,然後逐行遍歷代碼,直到找到問題。

相關問題