- [__ NSCFDictionary rangeOfString:]: нераспознанный селектор, отправленный экземпляру - PullRequest
0 голосов
/ 23 декабря 2011

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

вот мой код отправки почты, в котором я получаю сообщение об ошибке -[__NSCFDictionary rangeOfString:]: unrecognized selector sent to instance

и вот мой код метода, который вызывается при нажатии кнопки.

NSString* ingredientLine = [arrayOfIngredientList objectAtIndex:i];

NSArray* split ;

NSRange range = [ingredientLine rangeOfString:@"~"];

if (range.length > 0)
{
    split = [ingredientLine componentsSeparatedByString:@"~"];

    if( [split count] > 1 )
    {
        float amount = [[split objectAtIndex:0] floatValue];

        float actualAmount = amount*((float)recipeServings/(float)4);

        //parse the float if its 1.00 it becomes only 1

        NSString* amnt = [NSString stringWithFormat:@"%.1f", actualAmount];

        NSArray* temp = [amnt componentsSeparatedByString:@"."];

        if([[temp objectAtIndex:1] isEqualToString: @"0"])

            amnt = [temp objectAtIndex:0];

        if( actualAmount == 0.0 )

            amnt = @"";

        [amnt stringByReplacingOccurrencesOfString:@".0" withString:@""];

        NSLog(@"Amount is : %@",[split objectAtIndex:1]);

        strAmount = [@"" stringByAppendingFormat:@"%@ %@",amnt,[split objectAtIndex:1]];

        NSLog(@"Ingredient is : %@", strAmount);

        strIngedient = [split objectAtIndex:2];

    }
    else //ingredients header
    {
        //[[cell viewWithTag:10] setHidden:YES];
        strIngedient = [split objectAtIndex:0];
    }
}
else 
{

}

strIngredientsInfo = [strIngredientsInfo stringByAppendingFormat:@"%@ - %@ </br>",strAmount,strIngedient];

Приложение вылетает из-за

    NSArray* split ;

NSRange range = [ingredientLine rangeOfString:@"~"];

if (range.length > 0)
{
    split = [ingredientLine componentsSeparatedByString:@"~"];
    }

Пожалуйста, помогите.

Пожалуйста, скажите, почему это происходит сбой ???? (

1 Ответ

2 голосов
/ 23 декабря 2011

Это происходит потому, что иногда этот кусок кода:

[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.

...