NSArray objectAtIndex索引0超出空数组的边界

我正在处理别人的应用程序,而我得到这个错误:

'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 0 beyond bounds for empty array' 

Xcode指向这一行:

  NSDictionary *geo = [response[0] objectForKey:@"geometry"]; 

以下是完整的方法:

 - (void)loadLatLong { indx ++; if (indx == [datalist count]) { [self showMarker]; // self.alertView.hidden = true; // [self setThreeQuarters]; [self.progressbar setProgress:1.0 animated:YES]; return; } PointClass *pt = datalist[indx]; NSString *stPt = [pt.Location stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSString *str = [stPt stringByReplacingOccurrencesOfString:@" " withString:@"+"]; NSString *url = [NSString stringWithFormat:@"https://maps.google.com/maps/api/geocode/json?address=%@&sensor=false&key=AIzaSyAoSBH8mBmeVp2HVx6vJrkTvl3bjRFiWag",str]; NSURL *urlString = [NSURL URLWithString:url]; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.responseSerializer = [AFJSONResponseSerializer serializer]; manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"]; [manager GET:[urlString absoluteString ]parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSArray *response = [responseObject objectForKey:@"results"]; NSDictionary *geo = [response[0] objectForKey:@"geometry"]; NSDictionary *location = [geo objectForKey:@"location"]; pt.lat = [[location objectForKey:@"lat"] doubleValue]; pt.lng = [[location objectForKey:@"lng"] doubleValue]; datalist[indx] = pt; NSLog([NSString stringWithFormat:@"%%d \n"], indx); [self loadLatLong]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { }]; } 

无法弄清楚在哪里改变代码。

更新:我想补充说,它只是有时崩溃,有时加载

代码假定response数组总是至less有一个元素。 这在数组为空时会中断,因此您需要添加代码来检查它:

 NSArray *response = [responseObject objectForKey:@"results"]; if (response.count == 0) { // Continue loading more data: [self loadLatLong]; return; } NSDictionary *geo = [response[0] objectForKey:@"geometry"]; 

它是因为response没有任何对象而崩溃的。 您应该在调用response[0]之前检查它。 像这样if ([response count] == 0) return;