1

ブール値を指す文字列の辞書が必要です。

このように作成したNSDictionarytoolStatesがあります

NSArray *keys = [NSArray arrayWithObjects:@"X", @"Y", nil];
NSArray *isActive = [NSArray arrayWithObjects:[NSNumber numberWithBool:NO], [NSNumber numberWithBool:YES], nil];
toolStates = [NSDictionary dictionaryWithObjects:isActive forKeys:keys];

私のクラスの他の場所で、私はこのようなbooean値を取得して比較しようとしています

if ([toolStates valueForKey: @"X"] == [NSNumber numberWithBool:NO]) NSLog(@"%s", "X = NO");

コードの両方の部分が実行されていることはわかっていますが、出力を含むifステートメントで「EXC_BAD_ACCESS」エラーが発生します。

<Error>: CGAffineTransformInvert: singular matrix.

比較に何か問題がありますか?

これを試してみると、同じエラーが発生します。

[toolStates setValue:[NSNumber numberWithBool:YES] forKey:@"X"];
4

1 に答える 1

12

あなたが書いたものにはいくつかの問題がありますが、どちらもあなたの差し迫った問題に責任があるとは思いません (以下を参照)。いくつかの問題を見ていきましょう。

  1. ではなく があるため、書かれたとおり[toolStates setValue:forKey:]に動作できませNSDictionaryNSMutableDictionary
  2. -valueForKey:戻りますid(つまりNSNumber、 ではなくインスタンスを返しますBOOL。そのため、比較は正しく==ありません。ポインター比較を行っていますが、これは望んでいるものではありません。(がシングルトンを返すように最適化されている場合は、ここで機能する可能性がありますが、そうではありません) Objective-C で等値比較を行う正しい方法は、次のようなメソッドです。NSNumber+numberWithBool:-isEqual:if ([[toolStates valueForKey:@"X"] isEqual:[NSNumber numberWithBool:NO])

しかし、EXC_BAD_ACCESSこれは通常、割り当て解除されたオブジェクトにアクセスしていることを意味します。コードとは関係のない Core Graphics に関連するエラーが発生しているという事実によって、私の疑念は強まります (ガベージ ポインターが現在、グラフィックス関連の何かを指していることを示唆しています)。

ARCを使用していますか?そうでなければ、どこにも留まらないと思いますtoolStates。そうではなく、実行ループの次のターンの後にアクセスしている場合 (そのように聞こえます)、クラッシュが予想されます。これが正しくない場合、または問題が見つからない場合は、次のことを試してください。

  1. Xcode 静的アナライザー (Clang) を使用してコードを実行します。スローされる警告を修正します。
  2. ゾンビを有効にしてコードを実行し、「割り当て解除されたインスタンスに送信されたメッセージ」またはその影響を監視します。
于 2012-08-08T22:54:06.867 に答える