Сбой приложения IOS: [nsarrayi objectAtIndex:]: индекс 0 за пределами пустого массива

у меня есть метод, который я передаю " id " здесь:

NSString *id = @"4bf58dd8d48988d181941735";
[self getNames:id];

это отлично работает, но когда я использую "id" из объекта, переданного в segue:

NSString *id = _selectedStore._id;
[self getNames:id];

Я получаю сообщение об ошибке:

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

что происходит?

вот где он получает ошибку. Моя попытка (имейте в виду, что я новичок в этом) - взять массив идентификаторов Foursquare, получить имена, а затем получить photoUrl для идентификаторов. Если я удалю весь код, который создает photoUrl (я отметил в коде) он работает без сбоев.

- (void)getNames {
    NSMutableArray *final = [[NSMutableArray alloc] init];
    for (SearchVenue *object in self.venues) {
    [Foursquare2 venueGetDetail:object._id  callback:^(BOOL success, id result){
            if (success) {
                NSDictionary *dic = result;
                NSArray *venue = [dic valueForKeyPath:@"response.venue"];
                self.venueDetail = venue;                
                NSMutableDictionary *newVen = [NSMutableDictionary dictionary];
                [newVen setValue:[self.venueDetail valueForKey:@"name"] forKey:@"name"];
                [final addObject:newVen];
                    [Foursquare2 venueGetPhotos:object._id limit:nil offset:nil callback:^(BOOL success, id result){
                        if (success) {

                            NSDictionary *dic = result;
                            NSArray *photos = [dic valueForKeyPath:@"response.photos"];
                            self.venuePhotos = photos;

                             //works when removed from here...
                            NSString *prefix = [[self.venuePhotos valueForKeyPath:@"items.prefix"] objectAtIndex:0];
                            NSString *size = @"100x100";
                            NSString *suffix = [[self.venuePhotos valueForKeyPath:@"items.suffix"] objectAtIndex:0];
                            NSArray *myStrings = [NSArray arrayWithObjects:prefix,size,suffix, nil];
                            NSString *photoUrl = [myStrings componentsJoinedByString:@"" ];
                            //...to here

                            NSMutableDictionary *newVen1 = [NSMutableDictionary dictionary];
                                [newVen1 setValue:photoUrl forKey:@"photoUrl"];
                            for(int i = 0; i < [final count]; i++) {
                               [[final objectAtIndex:i] addEntriesFromDictionary:newVen1];
                            }
                            _arrayOfPlaces = final;
                            NSLog(@"_arrayOfPlaces is %@",_arrayOfPlaces);
                            [self.resultsVC reloadData];
                        } else {
                            NSLog(@"%@",result);
                        }
                    }];
            } else {
                NSLog(@"%@",result);
              }
        }];
    }
}

2 ответов


ваша проблема, вероятно, здесь:

NSString *prefix = 
 [[self.venuePhotos valueForKeyPath:@"items.prefix"] objectAtIndex:0];

вы должны сделать это:

if ([[self.venuePhotos valueForKeyPath:@"items.prefix"] count] > 0) {
NSString *prefix = 
 [[self.venuePhotos valueForKeyPath:@"items.prefix"] objectAtIndex:0]
...
} else {
// Do something for not having the prefix
}

Если вы хотите быть ультра-безопасным, что всегда хорошо, сделайте это

if ([[self.venuePhotos valueForKeyPath:@"items.prefix"] 
                         isKindOfClass:[NSArray class]] 
 && [[self.venuePhotos valueForKeyPath:@"items.prefix"] count] > 0)

Это также гарантирует, что элемент является массивом. Если 1 [self.venuePhotos valueForKeyPath:@ " предметы.префикс"] 1 нет, и он не реагирует на count, он будет сбой.

обобщенное эмпирическое правило, которое редко последовательно соблюдается, всегда проверяет границы до доступа к массиву с помощью индекс. Это независимо от того, получаете ли вы его по индексу или objectAtIndex.


 id object =  __NSArrayI[i];

NSUInteger index = [__NSArrayI indexOfObject:object];

попробуйте это..сначала проверьте количество массивов.