1

最大 2^16 の要素を持つ可能性のある NSMutableArray を作成するが、ほとんどが空になる場合、スペースを浪費することになりますか、それとも NSMutableArray はスパース配列として実装されますか?

4

3 に答える 3

8

内の要素をNSArray空にすることはできず、「デフォルト」値はありません。を表すnilには、通常、シングルトン[NSNull null]を使用します。これは、オブジェクトへの参照であるため、メモリ(ポインタ)を消費します。代わりに、数値()キーでNSDictionary(または)を使用することを検討します。NSMutableDictionaryNSNumber

于 2011-07-11T08:36:38.933 に答える
1

いいえ、まばらな配列NSArrayでもありません。NSMutableArray4999 以外のすべてが設定された 5000 エントリの配列がある場合、[NSNull null]5000 エントリのスペースを使用しています。

同様に、には、インデックス 4999 を除くNSPointerArrayすべてのエントリを含む 5000 エントリのスペースがあります。NULL

NSMutableDictionaryOMZ で説明されているように、を使用してスパース配列オブジェクトを開発しました。これで、1 つのエントリのためのスペースしかありません。ただし、このスペースはインデックスとオブジェクトの両方を保持し、インデックス値をNSNumbers に変換するオーバーヘッドがあります。そのため、どこでも使用NSArrayできNSMutableArrayますが、パフォーマンスが低下します。これは、古典的な速度とスペースのトレードオフです。

https://github.com/LavaSlider/DSSparseArrayを参照してください

于 2014-05-26T17:48:16.597 に答える
-3

NSArray オブジェクトは、-initWithObjects、+arrayWithObjects を使用するか、-initWithArray などを使用して既存の配列の内容を使用することにより、作成時にデータを設定する必要があるという意味で静的 (または不変) です。後でオブジェクトを追加することはできません。

必要に応じてオブジェクトを動的に追加および削除できる具体的な可変サブクラス (NSMutableArray と呼ばれる) があります。ただし、(-initWithCapacity: または +arrayWithCapacity: のいずれかによって) 空の状態で初期化する場合、初期長として指定するものは単なるヒントです (配列はその数のオブジェクトを保持するのに十分なメモリで作成されます)。必要に応じて拡張されます。はい、この場合はスパース配列になります。

一番、

于 2011-07-11T08:29:53.203 に答える