NSArray вне пределов проверки - PullRequest
17 голосов
/ 15 марта 2012

вопрос noobie. Как лучше всего проверить, существует ли индекс NSArray или NSMutableArray. Я ищу везде безрезультатно !!

Вот что я пробовал:

if (sections = [arr objectAtIndex:4])
{
    /*.....*/
}

или

sections = [arr objectAtIndex:4]
if (sections == nil)
{
    /*.....*/
}

но оба выдают ошибку "вне границ", не позволяющую мне продолжить

(не отвечайте на попытку, потому что это не решение для меня)

Заранее спасибо

Ответы [ 4 ]

17 голосов
/ 15 марта 2012
if (array.count > 4) {
    sections = [array objectAtIndex:4];
}
2 голосов
/ 25 января 2013

Если у вас есть целочисленный индекс (например, i), вы можете вообще предотвратить эту ошибку, проверив границы массивов, как это

int indexForObjectInArray = 4;
NSArray yourArray = ...

if (indexForObjectInArray < [yourArray count])
{
    id objectOfArray = [yourArray objectAtIndex:indexForObjectInArray];
}
0 голосов
/ 24 мая 2016

Вы можете использовать оператор MIN для тихого сбоя, например [array objectAtIndex:MIN(i, array.count-1)], для получения следующего объекта в массиве или последнего.Может быть полезно, когда вы, например, хотите объединить строки:

NSArray *array = @[@"Some", @"random", @"array", @"of", @"strings", @"."];
NSString *concatenatedString = @"";
for (NSUInteger i=0; i<10; i++) {  //this would normally lead to crash
    NSString *nextString = [[array objectAtIndex:MIN(i, array.count-1)]stringByAppendingString:@" "];
    concatenatedString = [concatenatedString stringByAppendingString:nextString];
    }
NSLog(@"%@", concatenatedString);

Результат: "Какой-то случайный массив строк ...".

0 голосов
/ 17 мая 2012

Имейте в виду, NSArray находится в последовательном порядке от 0 до N-1 элементов

Вы пытаетесь access item, у которого превышен предел , а array равен nil, тогда компилятор выбрасывает bound error.

РЕДАКТИРОВАТЬ : ответ @ sch выше показывает, как мы можем проверить, есть ли у NSArray заказанный элемент в нем или нет.

...