最大 2^16 の要素を持つ可能性のある NSMutableArray を作成するが、ほとんどが空になる場合、スペースを浪費することになりますか、それとも NSMutableArray はスパース配列として実装されますか?
3 に答える
内の要素をNSArray
空にすることはできず、「デフォルト」値はありません。を表すnil
には、通常、シングルトン[NSNull null]
を使用します。これは、オブジェクトへの参照であるため、メモリ(ポインタ)を消費します。代わりに、数値()キーでNSDictionary
(または)を使用することを検討します。NSMutableDictionary
NSNumber
いいえ、まばらな配列NSArray
でもありません。NSMutableArray
4999 以外のすべてが設定された 5000 エントリの配列がある場合、[NSNull null]
5000 エントリのスペースを使用しています。
同様に、には、インデックス 4999 を除くNSPointerArray
すべてのエントリを含む 5000 エントリのスペースがあります。NULL
NSMutableDictionary
OMZ で説明されているように、を使用してスパース配列オブジェクトを開発しました。これで、1 つのエントリのためのスペースしかありません。ただし、このスペースはインデックスとオブジェクトの両方を保持し、インデックス値をNSNumber
s に変換するオーバーヘッドがあります。そのため、どこでも使用NSArray
できNSMutableArray
ますが、パフォーマンスが低下します。これは、古典的な速度とスペースのトレードオフです。
NSArray オブジェクトは、-initWithObjects、+arrayWithObjects を使用するか、-initWithArray などを使用して既存の配列の内容を使用することにより、作成時にデータを設定する必要があるという意味で静的 (または不変) です。後でオブジェクトを追加することはできません。
必要に応じてオブジェクトを動的に追加および削除できる具体的な可変サブクラス (NSMutableArray と呼ばれる) があります。ただし、(-initWithCapacity: または +arrayWithCapacity: のいずれかによって) 空の状態で初期化する場合、初期長として指定するものは単なるヒントです (配列はその数のオブジェクトを保持するのに十分なメモリで作成されます)。必要に応じて拡張されます。はい、この場合はスパース配列になります。
一番、