NSRegularExpression: enumerateMatchesInString зависает, когда вызывается более одного раза

В контексте разрабатываемого мной приложения для iPhone я анализирую HTML-код для извлечения данных для отображения с помощью NSRegularExpression. Эта информация обновляется всякий раз, когда пользователь «перемещает» карту в новое место.

Это работает нормально в первый или два раза, но при втором или третьем вызове функции приложение зависает. Я использовал профилировщик XCode, чтобы подтвердить, что у меня нет утечки памяти и не возникает никаких ошибок (приложение не завершается, оно просто находится в процессе выполнения в точке, показанной ниже).

Когда я проверяю анализируемый HTML, я делаю это не видеть, что он неполный или иным образом искажен, когда приложение зависает.

Кроме того, если я заменю код регулярного выражения на набор явно адресных строк, все будет работать должным образом.

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
   // receivedData contains the returned HTML
   NSString *result = [[NSString alloc] initWithData:receivedData encoding:NSASCIIStringEncoding];
   NSError *error = nil;
   NSString *pattern = @"description.*?h4>(.*?)<\\/h4>.*?\"address>[ \\s]*(.*?)<.*?zip>.*?(\\d{5,5}), US<";
   NSRegularExpression *regex = [NSRegularExpression         
                              regularExpressionWithPattern:pattern
                              options:NSRegularExpressionDotMatchesLineSeparators
                              error:&error];
   __block NSUInteger counter = 0;
   // the application hangs on the next line after 1-2 times through
   [regex enumerateMatchesInString:result options:0 range:NSMakeRange(0, [result length]) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){
       NSRange range = [match rangeAtIndex:2];
       NSString *streetAddress =[result substringWithRange:range];
       range = [match rangeAtIndex:3];
       NSString *cityStateZip = [result substringWithRange:range];
       NSString *address = [NSString stringWithFormat:@"%@ %@", streetAddress, cityStateZip];
       EKItemInfo *party = [self addItem:address]; // geocode address and then map it
      if (++counter > 4) *stop = true;        
   }];
   [receivedData release];
   [result release];
   [connection release]; //alloc'd previously, so release here.
}

Я понимаю, что это будет сложно / невозможно скопировать, но мне было интересно, сталкивался ли кто-нибудь с аналогичной проблемой с NSRegularExpression или здесь что-то явно не так.

11
задан Eric 22 June 2011 в 04:23
поделиться