-[__NSCFDictionary rangeOfString:]: unrecognized selector sent to instance

倾然丶 夕夏残阳落幕 提交于 2019-12-25 02:17:03

问题


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:


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.



来源:https://stackoverflow.com/questions/8616705/nscfdictionary-rangeofstring-unrecognized-selector-sent-to-instance

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!