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 ???? :(
It is happening because sometimes this piece of code:
returns an instance of an
NSDictionary
instead of theNSString
you are expecting. It does this because somewhere beforehand you have stored anNSDictionary
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:
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 puttingNSDictionary
instances in yourarrayOfIngredientList
.EDIT: Some explanation of what's happening here might help you. The
if
statement checks to see whether the object pointed to byingredientLine
does not respond to the messagerangeOfString:
. Even though you've declaredingredientLine
as anNSString *
, you can easily assign it to an instance of a completely different class, in which case it won't be anNSString
instance anymore and it won't be able to respond toNSString
's messages. Note that you could also say:Which would do the same job here. However I used
respondsToSelector:
as it's a very useful message to know about in Objective C.