24/7 twenty-four seven

iOS/OS X application programing topics.

NSDictionary の objectForKey: と valueForKey: の違い

objectForKey: は NSDictionary のメソッドですが、 valueForKey: は KVC (Key Value-Coding) 由来のメソッドです。

If key does not start with “@”, invokes objectForKey:. If key does start with “@”, strips the “@” and invokes [super valueForKey:] with the rest of the key.

NSDictionary Class Reference

上記の通り、たいていの場合 valueForKey: は objectForKey: と同じ結果を返しますが、キー値が「@」から始まる場合、異なる動作をします。
キー値が「@」から始まる場合、「@」を除いた値を引数にしてスーパークラスの valueForKey: を呼び出すとあるので、NSObject の valueForKey: が呼ばれることになります。
つまり、KVC のキー値によるプロパティのアクセスになるので、偶然同じ名前のプロパティかメソッドを持っていない限り、例外が発生してクラッシュします。
たとえ同じ名前のメソッドを持っていてクラッシュを免れたとしても期待する動作ではないでしょう。

下記のようにキー値に何を渡しているか間違いない場合は構いませんが、キーに変数を渡す場合などはもしかしたら「@」で始まる値が入ってくるかもしれません。

NSString *name = [dictionary valueForKey:@"name"]; // OK
NSString *name = [dictionary valueForKey:nameKey]; // 危険


ということで、NSDictionary から値を取得する場合は、いつでも objectForKey: を使う方が安全です。