2017-02-06 40 views
0

forループは辞書内の辞書を繰り返し、完全に別の辞書のキーと一致するキーを持つループを検索します。2つの辞書値を比較すると、NSInvalidArgumentExceptionが返されます

両方の値が何も一致しない場合は問題ありません。しかし、彼らは私に、このエラーを与えて、それがクラッシュし、(常に256文字の長NSStringのである)の値を持っている瞬間:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSTaggedPointerString objectForKey:]: unrecognized selector sent to instance 0xa000000333939394' 

は、私は何か見当もつかない、および任意の助けいただければ幸いです。

必要に応じてコードを追加できます。

ありがとうございました。

更新:タイプをチェックするためにforループを更新しましたが、同じ問題が発生します。

更新2:変更済み||あなたはデータの種類を確認する必要があり、比較する前に、オブジェクト型NSTaggedPointerString

objectForKeyメソッドを呼び出したので& &

for (id rDCKey in rootDictCopy) 
{ 
    tempHouseNumber = rDCKey; 

    if ([[rootDictCopy objectForKey:rDCKey] isKindOfClass:[NSMutableDictionary class]] && [[routePathRootDictCopy objectForKey:houseNumber] isKindOfClass:[NSMutableDictionary class]]) 
    { 
     if ([[[rootDictCopy objectForKey:rDCKey] objectForKey:@"RandomUniqueIdentifier"] isEqual:[[routePathRootDictCopy objectForKey:houseNumber] objectForKey:@"RandomUniqueIdentifier"]]) 
     { 
      NSLog(@"done"); 
      goto DONE; 
     } 
    } 
    else 
    { 
     NSLog(@"ERROR"); 
    }    
} 
+2

おそらく、NSStringオブジェクトの代わりにNSStringオブジェクトのobjectForKeyを呼び出すことがあります。 rootDictCopyの内容を確認します。タイプチェックを追加することができます。 :P –

+0

@AmitTandelちょうどチェックされて、彼らは両方とも適切なNSMutableDictionariesであり、NSMutableDictionaryと同じようにログに現れます。 – JustMe

+0

"rootDictCopy"と "routePathRootDictCopy"のログはどのように表示できますか? –

答えて

1

reason: '-[NSTaggedPointerString objectForKey:]: unrecognized selector sent to instance 0xa000000333939394'

に例外が発生しました。あなたは以下のように行うことができます :

if ([obj isKindOfClass:[NSDictionary class]]) { 
    // is a NSDictionary 
    // do further action like get objectForKey, compare .. 
} else { 
    // you don't got what you want -> print error log or something like that 
} 

そして、あなたのコードは以下のようにする必要があります:

for (id rDCKey in rootDictCopy) 
{ 
    tempHouseNumber = rDCKey; 
    // TODO: 
    // check if rootDictCopy is a NSDictionary (if needed) 
    // check if routePathRootDictCopy is a NSDictionary (if needed) 
    // check if [rootDictCopy objectForKey:rDCKey] is a NSDictionary 
    // check if [routePathRootDictCopy objectForKey:houseNumber] is a NSDictionary 
    if ([[[rootDictCopy objectForKey:rDCKey] objectForKey:@"RandomUniqueIdentifier"] isEqual:[[routePathRootDictCopy objectForKey:houseNumber] objectForKey:@"RandomUniqueIdentifier"]]) 
    { 
     NSLog(@"done"); 
     goto DONE; 
    } 
} 

注:私の答えは、クラッシュすることなく、あなたのコードの作業を支援しますが、予期しないオブジェクト型を持って、なぜあなたを見つける必要がありますがここに。そして、あなたがいつも確実にNSMutableDictionaryオブジェクトを受信したことを確認するには、それが最善の解決策です!

+0

私はあなたの提案をタイプをチェックすることを試みました、そしてそれは問題なしでそれを渡します。私は次の行にも同じ問題が発生します。 – JustMe

+0

ご質問にお答えしたコードを更新してください。 あなたのコードで何が起こっているのかを簡単に把握できます。 –

+0

投稿が更新されました – JustMe

0

ユーザーNhat Dinh、Amit Tandel、Larmeが示唆しているように、rootDictCopy内の一部の辞書は、コードの前のNSStringに変換されていました。私はそれを修正して、その辞書を辞書のままにしました。私はもはやそのエラーを受け取りません。みんなありがとう!

関連する問題