NSArray
これらの 2 つのコレクション タイプは、通常は対応する部分であるNSDictionary
と同等のミュータブルを使用しているため、私はめったに使用しません。特定の状況で他の 2 つよりもはるかに高速に動作するコレクションを見逃しているような気がします。これらを使用する理想的な時期と方法は?
3 に答える
NSSet
オブジェクトのメンバーシップを頻繁にテストしたいが、順序を気にせず、コレクションに重複したオブジェクトを含める必要がない場合に使用します。AnNSSet
はそのオブジェクトを特定の順序で保存しません。むしろ、このクラスは、コレクション内にオブジェクトが存在するかどうかを効率的にテストするように明示的に設計されています。
同じことが にNSCountedSet
も当てはまりますが、複製されたオブジェクトの数NSCountedSet
も保持します。
つまり、一言で言えば、オブジェクトのコレクションを保持するだけでなく、メンバーシップのテストに関心がある場合は set を使用します (一部はisEqualTo
何らかの方法で決定されるため、重複する可能性があります)。
midpadi をフォローアップすると、NSArray の多くの使用は NSSet に置き換える必要があります。NSSet は、一意のオブジェクトのコレクションです。NSArray は、順序付けられたオブジェクトのコレクションです。オブジェクトに固有の順序がなく、一意である場合は、NSSet を使用する必要があります。
私は非常に頻繁に NSSet をモデル層に保持し、注文を必要とする UI コンポーネントに独自の NSArray を作成させます。たとえば、「仲間」で構成される「仲間リスト」の場合を考えてみましょう。バディ リスト自体は順不同です。それはただのコレクションです。また、オブジェクトは一意である必要があります。ただし、UI レイヤーでは順序が必要であり、同じ仲間を複数のグループ (たとえば、お気に入りとオフライン) に入れたい場合もあります。しかし、これらは UI の問題であり、モデル レイヤーはそれらについて心配する必要はありません。
NSSet *buddies = [buddyList allBuddies];
BOOL isBuddy = [buddyList containsObject:buddy];
NSArray *buddyList = [[buddyList allBuddies] sortedAraryUsingSelector:[self buddySortSelector]];
新しい仲間が現れると、BuddyList は通知 ( BuddyListDidAddBuddiesNotification
) を投稿します。この通知には、追加された仲間の NSSet が userInfo に含まれています。したがって、これを監視している UI 要素は、適切な並べ替え順序で仲間をリストに挿入できます。これにより、リスト アニメーションが非常に簡単になりますが、モデル レイヤーですべての並べ替えられたバージョンを維持する場合は、はるかに困難になります。
2 つの NSSet がある場合、それらの違いを理解し、一連の削除と追加を作成して一方を他方に変換するのは非常に簡単です (これもアニメーションに役立ちます)。NSArray でこれを行うのははるかに複雑です。
したがって、NSSet をデフォルトにすることをお勧めします。実際に順序付けが必要な場合にのみ NSArray を使用してください。残念ながら、これはほとんどの人が行う方法とは逆です。
主にセットについて話しているがカウント セットについてはあまり話していない他の回答に加えて、カウント セットをいつ使用するのが最適なのか疑問に思うかもしれません。カウントされたセットは、重み付けやその他の統計アルゴリズムなどに役立ちます。最終的には、保存されたカウントを使用してソートされた内容の順序付けられた配列を最終的に作成できます。
別のオプションは、一意のテーブル、または参照カウンター/ガベージコレクターの形式です。カウントされたセットを使用すると、含めるためのテストが可能になります (つまり、CoreData が内部で行うことと同様に、新しいオブジェクトを作成するのではなく、既存の同一のオブジェクトを返す) と同時に、含まれる値に対して一種の参照カウントを実行することもできます。カウントが 0 になるとセットによって解放されます。