- [__ NSCFDictionary rangeOfString:]:无法识别的选择器发送到实例

时间:2011-12-23 13:35:13

标签: iphone objective-c ios4 nsdictionary nsrange

我知道这里有很多解决方案可以解决这个问题,但是我被困在一条线路上,有时会成功运行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:@"~"];
    }

请帮助。

请建议它崩溃的原因???? :(

1 个答案:

答案 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中了解的非常有用的信息。