2013-07-03 3 views
0

Я пытаюсь найти ответ на проблему, которая меня озадачивала с прошлой ночи.ObjC/Cocoa NSRange: Диапазон или индекс за пределами

NSRange searchRange.location = 0; 
NSRange searchRange.length = [string length]; // > 2000 characters long 
NSString *substring = @"substring"; // Occurs within string several times 

NSRange substringRange = [string rangeOfString:substring options:NSCaseInsensitiveSearch range:searchRange]; 

// Some code here. Create substring and add it to array. 

// Move the search range on 
searchRange.location = substringRange.location + substringRange.length; 

// fails 
substringRange = [string rangeOfString:substring options:NSCaseInsensitiveSearch range:searchRange]; 

Первая [строка rangeOfString ...] метод вызывается без сучка, но результаты второго вызова в следующей ошибке:

* -[__NSCFString rangeOfString:options:range:locale:]: Range or index out of bounds

Из того, что я могу сказать, что проблема вызвана путем присвоения нового значения searchRange.location - удаление этого оператора приводит к успешному второму вызову метода. Рассматривая отладчик, значения кажутся такими же предсказанными - ничего вне диапазона - и я остаюсь кричать на мониторе.

Это просто простое дополнение ... не так ли?

+0

Вы, вероятно, не хотите дважды объявлять 'NSRange searchRange' дважды. –

+0

Я понятия не имею, что вы пытаетесь сделать. – Radu

+0

@ Radu выполняет арифметику по структуре? – Kreiri

ответ

6

Проблема в том, что вы изменяете местоположение, но не изменяете длину. Результат - слишком длинный диапазон. Решение состоит в том, чтобы уменьшить длину на ту же сумму, что и при увеличении местоположения.

+0

По-прежнему получает ту же ошибку. – Oliver

+0

Я думаю, что вы «1» после расчета? – Wain

+2

Это работает: searchRange.length = [длина строки] - searchRange.location; – stosha