Как сказано в документации на яблоко ..
substringWithRange:
Возвращает строковый объект, содержащий символы получателя, которые находятся в заданном диапазоне.
- (NSString *)substringWithRange:(NSRange)aRange
aRange
A range. The range must not exceed the bounds of the receiver.
Вам нужно проверять каждый раз, когда вы создаете NSMakeRange (), является ли Range, который вы указали в пределах длины вашей строки, ИЛИ ... не используя какое-то if and else
условие