-[__NSCFDictionary rangeOfString:]: unrecognized s

2019-09-06 17:56发布

i know many solutions are available here for this problem but I am stuck on a single line which runs sometime successfully n crashes sometimes, i really dont know why this is happening.....

here is my code of posting mail in which i m getting the error -[__NSCFDictionary rangeOfString:]: unrecognized selector sent to instance

and here is my code of the method which is called on button pressed.

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];

App crashes due to

    NSArray* split ;

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

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

Please Help.

Please Suggest why it is crashing ???? :(

1条回答
Fickle 薄情
2楼-- · 2019-09-06 18:30

It is happening because sometimes this piece of code:

[arrayOfIngredientList objectAtIndex:i]

returns an instance of an NSDictionary instead of the NSString you are expecting. It does this because somewhere beforehand you have stored an NSDictionary in that array.

So, I don't know how big that array is and whether it's practical to print its entire contents out to see what's happening, but here's something to help you debug. In the piece where it's crashing, change it to this:

if ( ! [ingredientLine respondsToSelector:@selector(rangeOfString:)] ) {
    NSLog(@"ingredientLine is not an NSString! It is a: %@", ingredientLine);
} else {
    NSRange range = [ingredientLine rangeOfString:@"~"];
}

You can also put a breakpoint on the NSLog line to see what's happening. Note that this will stop your crashes, but it does not fix the underlying problem. This is just a suggestion to help you debug the real issue, which is that somewhere further up the line you are putting NSDictionary instances in your arrayOfIngredientList.

EDIT: Some explanation of what's happening here might help you. The if statement checks to see whether the object pointed to by ingredientLine does not respond to the message rangeOfString:. Even though you've declared ingredientLine as an NSString *, you can easily assign it to an instance of a completely different class, in which case it won't be an NSString instance anymore and it won't be able to respond to NSString's messages. Note that you could also say:

`if ( ! [ingredientList isKindOfClass:[NSString class]] )`

Which would do the same job here. However I used respondsToSelector: as it's a very useful message to know about in Objective C.

查看更多
登录 后发表回答