2016-05-25 3 views
0

いつ使うのですか?辞書のすべてのキー対keyEnumerator?

辞書をループしてキー値を削除すると、列挙子はそれに対応しますか?あなたはあなたのコードが 列挙中にエントリを変更するべきではありません、 NSDictionaryの可変のサブクラスのインスタンスでこのメソッドを使用する場合は

:ドキュメントは、その質問に答えているようです。エントリを変更する場合は、allKeys プロパティを使用して、辞書のキーのスナップショットを作成します。次に、 このスナップショットを使用してエントリをトラバースし、途中で変更します。

パフォーマンスは、人々が常に知りたいからです。

+0

を持つ配列の必要がない場合keyEnumerator'はない 'ながら' allKeys'は 'NSArray'を作成します。そこでそこでは最適化が行われます。だから、 'keys'(単純な' NSString'だけでなく大きなもの)がたくさんある場合、 'keyEnumerator'が好きです。そうでなければ、デバイスはかなり性能があり、大きな問題ではありません(違いが気付かないかもしれません)。 – Larme

+0

配列内の個々のオブジェクトのサイズは関係ありません。 'NSArray'はそれに追加されたオブジェクトをコピーしないので、' allKeys'によって返された配列は元のキーオブジェクトへのポインタを持っています。 – Avi

答えて

0

NSDictionaryによる繰り返しは、少なくとも2つの方法で実現できます。NSArray[NSDictionary allKeys]またはNSEnumeratorとします。

NSArray *keyArray =  [bigUglyDictionary allKeys]; 
int count = [keyArray count]; 
for (int i=0; i < count; i++) { 
  NSDictionary *tmp = [bigUglyDictionary objectForKey:[ keyArray objectAtIndex:i]]; 
} 

NSEnumerator *enumerator = [bigUglyDictionary keyEnumerator]; 
id key; 
while ((key = [enumerator nextObject])) { 
    NSDictionary *tmp = [bigUglyDictionary objectForKey:key]; 
} 

第二の方法は、少し速くなるので、あなたは巨大な辞書と連携し、そのキー