2011-09-15 2 views
2

NSArrayのデータは、コンピュータのメモリ(1つずつオブジェクト)に連続して格納されていることを常に理解しています。私の質問はどのようにNSSetが格納されているのですか?各オブジェクトがコンピュータのメモリ内の別の場所に格納されている場合は、配列よりも遅くなりますか?NSSetsはどのようにメモリに格納され、より効率的になるのですか?

乾杯

はNSSetsは、より多くのリンクリストのように動作しますか?

+0

オブジェクトに一意の値のみを含める場合は、NSSetを使用する必要があります。さもなければ 'NSArray'を使うのが便利です。 – Nekto

答えて

3

NSArrayで使用されるストレージについては記載されていません。そして、それはすべての配列で同じであると仮定すべきではありません。 ridiculousfish.com、Our arrays aren’tに優れた記事があります。

あなたの要件で最も速いものが何か不思議です。 NSSetの使い方については、自分でテストを行うか、具体的に行う必要があります。

+0

応答に感謝します。私はちょうどあなたがNSArrayを介してNSSetを使用するシナリオに疑問を抱いていた – geminiCoder

+0

別のポスターが言ったように、その意味をしたいとき。重複排除は1つの意味論です。 NSSetsは、isSubsetOfSet:とintersectsSet:のようなset-ish演算も提供します。 NSMutableSetは、unionSet :, minusSet :,およびintersectSet:を提供します。理論的にはNSArrayで操作できない操作はありません(つまり、配列を走査して重複を取り除き、これらの操作をすべて近似することができます)が、NSSetはすぐに正しいセマンティクスを持ちます。要するに、それが仕事のための正しいツールであるときにそれを使用してください! – ipmcc

2

NSArrayまたはNSSetを使用するかどうかは、パフォーマンスの特性に依存するのではなく、表現したいものの意味に従うべきです。

NSArrayは、インデックスによってアクセスされるアイテムの順序付けられたコレクション(穴のない)です。許可された重複。 NSSetは順序付けされておらず、同じオブジェクトを2回保存することはできません。

あなたがしたいことを知らずに、もっと言うことは難しいです。

+0

私はこの勧告を一歩前進させるかもしれません。最初は正しいセマンティクスを持つコレクションを使用し、必要な場合にのみパフォーマンスのためにAWAYを最適化します。例えば、重複していないコレクションが必要な場合はNSSetで始まり、後で手動で重複しないNSArrayがNSSetよりも優れていることがわかったら、それを使用して切り替えることができます。しかし、最も理にかなった選択から始め、経験的に必要な場合にのみパフォーマンスの感性からそらす。 – ipmcc

2

NSArrayを作成する方がNSSetを作成するよりもはるかに高速です。しかし、NSSet内のすべてのオブジェクトを検索する方が、NSArray内のすべてのオブジェクトを検索するよりもはるかに高速です。特に、indexOfObject:メソッドを使用してNSArrayを検索しています。

しかし、どちらを使うべきかを選ぶとき、スピードは考慮すべき最も重要なものではありません。

1つのオブジェクトを1回だけ保存する必要がある場合は、NSSetを使用します。そうでない場合はNSArrayを使用すると、オブジェクトは挿入する回数だけ格納されます。もちろん、NSArrayのオブジェクトはオーダーされています。

1

NSArray、NSMutableArray、NSSet、NSMutableSetおよびその他のコレクションの実装は、コレクション内のオブジェクトの数によって変化します。詳細 hereと詳細については、blog postのこの詳細な分析を参照してください。

@ Jean-Denisが示唆しているように、セマンティクスに基づいてコレクションを選択する必要があります。

関連する問題