因未捕获的异常“NSRangeException”而终止应用程序会使Range或index超出范围

时间:2011-11-23 09:38:41

标签: iphone location nsrange

我正在处理条形码应用程序并从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] * 终止app到期   未被捕获的异常'NSRangeException',原因:'    - [NSRegularExpression enumerateMatchesInString:options:range:usingBlock:]:Range或index   超出限制'第一次调用堆栈:( 0x326398bf 0x364a31e5   0x326397b9 0x326397db 0x3783846b 0x37838a11 0x37af 0xbe73 0x3548f5df   0x3548ef81 0x3548962f 0x3260db31 0x3260d15f 0x3260c381 0x3258f4dd   0x3258f3a5 0x37cd0fed 0x30eda743 0x2337 0x22b8)终止被叫   抛出异常程序接收信号:“SIGABRT”。数据   格式化程序暂时不可用,将在“继续”后重新尝试。   (找不到dlopen函数,因此无法加载共享   库)。

3 个答案:

答案 0 :(得分:2)

dito Aadhira

该应用也可能会崩溃

NSMakeRange(1, [locstr length])

您可以定义1到[locstr length]的范围,而[locstr length]必须是[locstr length] -1。

字符串“NSMakeRange”的长度为11个字符。因此,它的数组索引范围是0-10。覆盖您的代码,范围将是1-11,从1开始,停在1 + 10 = 11。

答案 1 :(得分:1)

resultString =[resultString substringWithRange:NSMakeRange(1,27)];

您确定resultString长度大于27吗?无论如何,如果它小于27,它将崩溃。应用程序似乎崩溃了。也可以在其他地方也使用过NSRange。

启用NSZombie以确定应用程序崩溃的位置。

答案 2 :(得分:1)

为什么要解析[CLLocation description]而不是使用位置,准确度等属性?不应该像这样使用描述。