Это происходит потому, что иногда этот кусок кода:
[arrayOfIngredientList objectAtIndex:i]
возвращает экземпляр NSDictionary
вместо ожидаемого NSString
. Это происходит потому, что где-то заранее вы сохранили NSDictionary
в этом массиве.
Итак, я не знаю, насколько велик этот массив и целесообразно ли распечатывать все его содержимое, чтобы увидеть, что происходит, но здесь есть кое-что, что поможет вам отладить. В части, где он падает, замените его следующим образом:
if ( ! [ingredientLine respondsToSelector:@selector(rangeOfString:)] ) {
NSLog(@"ingredientLine is not an NSString! It is a: %@", ingredientLine);
} else {
NSRange range = [ingredientLine rangeOfString:@"~"];
}
Вы также можете установить точку останова на линии NSLog
, чтобы увидеть, что происходит. Обратите внимание, что это остановит ваши сбои, но не решит основную проблему. Это всего лишь предложение, которое поможет вам отладить реальную проблему, заключающуюся в том, что где-то еще дальше вы помещаете NSDictionary
экземпляров в свой arrayOfIngredientList
.
РЕДАКТИРОВАТЬ: Некоторое объяснение того, что здесь происходит, может помочь вам. Оператор if
проверяет, не отвечает ли объект, на который указывает ingredientLine
, сообщение rangeOfString:
. Даже если вы объявили ingredientLine
как NSString *
, вы можете легко назначить его экземпляру совершенно другого класса, и в этом случае он больше не будет NSString
и не сможет отвечать на сообщения NSString
. Обратите внимание, что вы также можете сказать:
`if ( ! [ingredientList isKindOfClass:[NSString class]] )`
Что бы сделать ту же работу здесь. Однако я использовал respondsToSelector:
, так как это очень полезное сообщение в Objective C.