私が取り組んでいるプログラムでは、charのC配列を使用しています(これは潜在的に非常に大きな配列であるため、NSArrayを使用したくありません)。それぞれが特定のステータスに対応する値を格納しています。
各ステータスに関する情報を保存できるように、NSDictionaryを使用しています。各キーは、可能なステータス値に対応しています。各キーの値は、ステータス値に対応するために必要な情報を含むサブディクショナリです。
現在、NSDictionaryから情報を抽出したいときはいつでも、次のことを行っています。
for(i=0; i<arrayLen; i++) {
NSString *lookupKey1 = [[NSString alloc]initWithFormat:@"%i", array[i]];
int stateInfo1 = [[[statesDict objectForKey:lookupKey1]
objectForKey:@"infoKey1"] intValue];
[lookupKey1 release];
NSString *lookupKey2 = [[NSString alloc]initWithFormat:@"%i", array[i]];
int stateInfo2 = [[[statesDict objectForKey:lookupKey2]
objectForKey:@"infoKey2"] intValue];
[lookupKey2 release];
// Now do something with the values just obtained...
}
これは問題なく機能しますが、これを実行する必要がないのは、キーを検索するためだけにNSStringを割り当てる必要があることです。不必要な操作をしているような気がします。私は大きな配列を反復処理しているので、これは私にとって特に懸念事項です。絶対に必要な場合を除いて、この方法で速度を落としたくありません。
私が最初に望んでいたように、単に文字を渡そうとすると、次のことができます。
char stateInfo = [[[statesDict objectForKey:array[i]]
objectForKey:@"infoKey"] charValue];
コンパイラーは「objectForKeyの引数1を渡す:キャストなしで整数からポインターを作成します」という警告を出し、デバッガーはEXC_BAD_ACCESS例外をスローします。
また、フォーマットされた文字列リテラルを渡してみました。
char stateInfo = [[[statesDict objectForKey:(@"%i", array[i])]
objectForKey:@"infoKey"] charValue];
これにより、まったく同じエラーが発生します。私がやろうとしていることをより効率的に行う方法があるかどうか、または最初のスニペットで説明した方法が、私がやろうとしていることを実行するための「正しい」方法であるかどうかを誰かが知っていますか?