Posted at

NSMutableDictionaryの適切でない使い方

More than 5 years have passed since last update.

普段からObjective-Cを頻繁に書いているわけではないので、ありがちなミスかどうかは分からないのですが、NSMutableDictionaryを間違った使い方をしていたために起きていたバグを発見したのでメモしておこうと思います。


example01.c

NSMutableDictionary *mutable_dic = [[NSMutableDictionary alloc] initWithCapacity:2];

//辞書の生成
int i;
for (i = 0; i < 100; i++) {
NSDictionary *dic = [NSDictionary dictionaryWithObject:@"hoge" forKey:@"Key"];
[mutable_dic addEntriesFromDictionary:dict];
}

上記のようなコードがあったとき、[mutable_dic count] すると、辞書の長さはいくつになるでしょうか?

これ、1になります。[mutable_dic addEntriesFromDictionary:dict] の字面から、「add」しているんだから

ループ分の長さの辞書ができる気がしてしまうかもしれません。

しかし、このaddEntriesFromDictionaryは辞書の中に辞書を入れ子で突っ込んでいく処理をしているわけではなく、キーとバリューの組み合わせをmutable_dicに与えているだけです。

そして、辞書のキーは一意でなくてはいけません。ですから、毎ループごとにキーとバリューの組み合わせを上書きする処理になります。

そもそも、これに類する処理はNSMutableArrayを作って、突っ込んで行くのが適切だと僕は考えます。

実際に目撃した例だと、もう少し複雑でしたがArrayを使わない理由はなかったように思います。

ただ、この書き方をしてもループごとに「使うキーが異なる」場合なら、意図通り?にaddされていきます。