我知道这里有很多解决方案可以解决这个问题,但是我被困在一条线路上,有时会成功运行n次崩溃,我真的不知道为什么会发生这种情况......
这是我发布邮件的代码,我收到错误-[__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:@"~"];
}
请帮助。
请建议它崩溃的原因???? :(
答案 0 :(得分:2)
这种情况正在发生,因为有时这段代码:
[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中了解的非常有用的信息。