在IOS中访问给定索引处的数组对象时发生奇怪的崩溃

时间:2012-04-02 03:33:08

标签: ios

我们有以下方法尝试访问给定索引处的数组对象。数组是resultArr。当我们进行resultArr计数时,它给出了13的结果。所以我们知道数组不是null,但是当我们尝试objectAtIndex时,它会因错误而崩溃。

功能:

- (void)fetchedData:(NSData *)responseData {
      //parse out the json data
   NSError* error;
   NSDictionary* json = [NSJSONSerialization 
                         JSONObjectWithData:responseData //1

                         options:kNilOptions 
                         error:&error];

   NSArray *keys = [json allKeys];
   NSLog(@"keys: %@",keys);



   NSArray* htmlAttributions = [json objectForKey:@"html_attributions"]; //2


   NSArray* resultArr = (NSArray *)[json objectForKey:@"result"]; //2

   NSArray* statusArr = [json objectForKey:@"status"]; //2


   NSLog(@"htmlAttributions: %@",htmlAttributions);


   NSLog(@"result: %@", resultArr); //3

   NSLog(@"status: %@", statusArr); //3

   NSLog(@"resultCount: %d",[resultArr count]);

   [resultArr objectAtIndex:0];
  }

错误:

2012-04-01 22:31:52.757 jsonParsing[5020:f803] resultCount: 13 2012-04-01 22:31:52.759 jsonParsing[5020:f803] -[__NSCFDictionary objectAtIndex:]: unrecognized selector sent to instance 0x6d2f900 2012-04-01 22:31:52.760 jsonParsing[5020:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary objectAtIndex:]: unrecognized selector sent to instance 0x6d2f900'
*** First throw call stack:

谢谢。

3 个答案:

答案 0 :(得分:2)

错误消息非常具有描述性。您的代码期望为NSArray的其中一个对象实际上是NSDictionary。您无法使用NSDictionary方法访问NSArray内的字段(从NSDictionary*转换为NSArray*不会将NSDictionary转换为NSArray })。

这意味着在JSON内部,您的一个元素被序列化为对象/关联数组而不是普通数组。您可以通过将JSON数据视为文本,并找到使用{}而不是[]的项来轻松确定哪一项。

答案 1 :(得分:0)

你在说

NSArray* resultArr = (NSArray *)[json objectForKey:@"result"]; //2

但是这不会使这个对象([json objectForKey:@"result"])成为NSArray。它是一个NSDictionary,并向它发送一条消息,NSDictionary没有响应(objectAtIndex:)导致崩溃。

您可以发送count消息而不会崩溃,因为NSDictionary确实会响应count消息。但是你认为这是一个数组仍然是错误的。

答案 2 :(得分:0)

您尝试使用此行时无法将NSDictionary *强制转换为NSArray *:NSArray* resultArr = (NSArray *)[json objectForKey:@"result"];,然后调用-objectAtIndex。