2011-12-23 11 views
0

この問題では多くの解決策がありますが、時々正常に実行される1行にスタックされています。 ....- [__ NSCFDictionary rangeOfString:]:インスタンスに送信された認識できないセレクタ

はここ-[__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]; 

のAppは、助けてくださいによる

NSArray* split ; 

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

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

にクラッシュします。

なぜクラッシュするのかを教えてください。 :(コードの時々この作品ので、それが起こっている

+2

「ingredientLine」はどこから来たのですか?時にはそれは 'NSString'ではなくNSDictionaryであるように見えます。 – mattjgalloway

+0

私はInderDientlineを追加しました。それはインデックスの配列で取得する文字列です。 – NSException

+0

これで 'arrayOfIngredientList'はどこから来ましたか?そこにはNSStringのオブジェクトしかないのですか? (あなたが 'arrayOfIngredientList'を表示するために追加したビットを削除しました!) – mattjgalloway

答えて

2

:。

[arrayOfIngredientList objectAtIndex:i] 

がどこか事前にあなたがその中にNSDictionaryを格納しているので、それがこれを行い、あなたが期待している代わりにNSStringNSDictionaryのインスタンスを返します。配列。

私はその配列の大きさと何が起こっているかを見るために内容全体を印刷するのが実際的かどうかは分かりませんが、ここであなたがデバッグするのに役立つものがあります。これまで:

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

また、NSLog行にブレークポイントを設定して、何が起きているのかを確認することもできます。これによりクラッシュは止められますが、ではなく、が根底にある問題を修正しています。これは実際の問題をデバッグするのに役立つ単なる提案です。これはにNSDictionaryインスタンスを置いている行の上にあるものです。

編集:ここで起こっていることの説明が役立つかもしれません。 ifステートメントは、ingredientLineが指すオブジェクトがメッセージrangeOfString:に応答しないかどうかを確認します。 ingredientLineNSString *と宣言しても、完全に異なるクラスのインスタンスに簡単に割り当てることができます。その場合、NSStringインスタンスはもうなくなり、NSStringのものに応答することはできませんメッセージ。

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

ここでは同じ仕事をします。しかし、私はrespondsToSelector:を使用しました。これはObjective Cについて知るのにとても便利なメッセージです。

+0

ありがとうございます! :) – NSException

+0

あなたの配列に 'NSDictionary'インスタンスを置いた理由を知りましたか? –

+0

+1私から:... D –

関連する問題