Завершение приложения из-за необработанного исключения «NSRangeException» дает диапазон или индекс вне границ » - PullRequest
1 голос
/ 23 ноября 2011

Я работаю над приложением со штрих-кодом и получаю местоположение из CLController, чтобы оно давало местоположение, скорость и многое другое, поэтому я подставляю строку WithRange и получаю исключение, поэтому, пожалуйста, дайте мне причину и что мне для этого сделать?

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

- (void)locationUpdate:(CLLocation *)location {

locstr = [location description ];
//NSLog(@"current location is %@ ",locstr);

NSString* regexString =@"<(.*?)>";
NSRegularExpressionOptions options = NSRegularExpressionCaseInsensitive;
NSError* error = NULL;

NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:regexString options:options error:&error];
if (error) {
    //NSLog(@"error is %@", [error description]);
}

NSArray* results = [regex matchesInString:locstr options:0 range:NSMakeRange(1, [locstr length])];
for (NSTextCheckingResult* result in results) {


    resultString = [locstr substringWithRange:result.range];
    //NSLog(@"%@",resultString);
    //life = [[resultString substringWithRange:NSMakeRange(1)] retain];
    resultString =[resultString substringWithRange:NSMakeRange(1,27)];

    resultString = [resultString stringByReplacingOccurrencesOfString:@" "
                                                           withString:@""];
    life = [resultString stringByReplacingOccurrencesOfString:@"+"
                                                   withString:@""];
    life = [[life substringWithRange:NSMakeRange(0,[life length]-1)] retain];
    //NSLog(@"in update %@",life);


}

}

получение этого исключения

2011-11-23 14: 24: 58.161 BarCodeApp [2632: 707] * Завершение работы приложения чтобы исключить исключение 'NSRangeException', причина: ' - [NSRegularExpression enumerateMatchesInString: параметры: диапазон: usingBlock:]: диапазон или индекс Первый вызов стека вызовов вне границ: (0x326398bf 0x364a31e5 0x326397b9 0x326397db 0x3783846b 0x37838a11 0x37af 0xbe73 0x3548f5df 0x3548ef81 0x3548962f 0x3260db31 0x3260d15f 0x3260c381 0x3258f4dd 0x3258f3a5 0x37cd0fed 0x30eda743 0x2337 0x22b8) завершить вызов выдает исключениеПрограмма полученного сигнала: «SIGABRT». Данные Форматировщики временно недоступны, будут повторяться после «продолжить». (Не удается найти функцию dlopen, поэтому невозможно загрузить общий библиотеки.)

Ответы [ 3 ]

2 голосов
/ 23 ноября 2011

dito Aadhira

Приложение также может аварийно завершить работу при

NSMakeRange(1, [locstr length])

Вы задаете диапазон от 1 до [длина locstr], тогда как [длина locstr] должно быть [длина locstr]1.

Строка "NSMakeRange" имеет длину 11 символов.Таким образом, его диапазон индекса массива равен 0-10.Покрывая ваш код, диапазон будет 1-11, когда вы начнете с 1 и остановитесь на 1 + 10 = 11.

1 голос
/ 23 ноября 2011

Почему вы анализируете [CLLocation description] вместо использования таких свойств, как местоположение, точность и т. Д.? Описание не должно использоваться таким образом.

1 голос
/ 23 ноября 2011
resultString =[resultString substringWithRange:NSMakeRange(1,27)];

Вы уверены, что длина resultString больше 27?В любом случае, если он меньше 27, он рухнет.Кажется, приложение вылетает там.Может быть и в некоторых других местах, где вы использовали NSRange.

Включите NSZombie, чтобы точно определить, где именно происходит сбой приложения.

...