NSArray objectAtIndex 索引 0 超出空数组的范围
NSArray objectAtIndex index 0 beyond bounds for empty array
我正在开发其他人的应用程序,但遇到此错误:
'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
没有任何对象而崩溃。你应该在调用 response[0]
之前检查它。像这样 if ([response count] == 0) return;
代码假设 response
数组总是至少有一个元素。这会在数组为空时中断,因此您需要添加代码来检查它:
NSArray *response = [responseObject objectForKey:@"results"];
if (response.count == 0) {
// Continue loading more data:
[self loadLatLong];
return;
}
NSDictionary *geo = [response[0] objectForKey:@"geometry"];
我正在开发其他人的应用程序,但遇到此错误:
'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
没有任何对象而崩溃。你应该在调用 response[0]
之前检查它。像这样 if ([response count] == 0) return;
代码假设 response
数组总是至少有一个元素。这会在数组为空时中断,因此您需要添加代码来检查它:
NSArray *response = [responseObject objectForKey:@"results"];
if (response.count == 0) {
// Continue loading more data:
[self loadLatLong];
return;
}
NSDictionary *geo = [response[0] objectForKey:@"geometry"];