2012-08-07 21 views
5

可能性の重複:
NSMutableArray initWithCapacity nuances
Objective-c NSArray init versus initWithCapacity:0初期化NSMutableArrayの

次のコード行の違いは何ですか?正確な利点と欠点は何ですか?次に3つのaddObject操作を行います。

NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity: 5]; 
NSMutableArray *array = [[NSMutableArray alloc] init]; 
+0

これらの質問のいずれかと正確に重複しているわけではありませんが、一番上にはかなり近いです。 – JeremyP

+0

[Objective-c NSArray init対initWithCapacity:0]の可能な複製(http://stackoverflow.com/questions/6077422/objective-c-nsarray-init-versus-initwithcapacity0)、[NSMutableArray initWithCapacity:ニュアンス](http: //stackoverflow.com/questions/3948062/)、 –

答えて

5

定期的に様々なサイズのオブジェクト指向言語と配列との違いは次のとおりです。あなたが得るオーバーヘッドとメモリレベルでのページフォールト。

別の言い方をすれば、(最初の例のように)5つのスペースを要求するオブジェクトがあり、2番目のオブジェクトはスペースを予約しないとします。したがって、オブジェクトを最初のオブジェクトに追加する必要があるときには、すでにオブジェクトが格納されているスペースがすでに存在します。一方、非割り当てオブジェクトはまずメモリ上のスペースを要求してから、アレイ。このレベルではそれほど悪くはありませんが、配列のサイズが大きくなるとこれが重要になります。 Apple's documentationから

arrayWithCapacity:

を作成し、最初のオブジェクトの所定の数を保持するのに十分な 割り当てられたメモリとNSMutableArrayのオブジェクトを返します。 ... 新しいアレイの初期容量。戻り値 numItemsオブジェクトを保持するのに十分なメモリが割り当てられた新しいNSMutableArrayオブジェクト。

+0

良い推測ですが、実際に起こっていることではありません....Jeremyの答えを参照してください。 – bbum

+0

@bbum私はそれが推測ではないと思う。それは適切な説明です。ジェレミーの答えで、彼は使用されている可能性があります。 – Saad

+1

@Saadいいえ、本当に、それは推測です。ソースを読んでください(CFFoundationはオープンソースです)。 100,000スロットの配列を要求した場合、必ずしもすべてのスロットを事前に割り当てる必要はありません。データ構造はフラットな配列よりも少し複雑です。したがって、ドキュメントは誤解を招くものですが、完全に間違っているわけではありません。 – bbum

8

機能的には両方のステートメントが同一です。

最初のケースでは、すぐに5つのオブジェクトをアレイに追加するというヒントを実行時に与えて、好きな場合にスペースをあらかじめ割り当てることができます。これは、最初の5つのステートメントを使用して最初の5つのaddObject:呼び出しがわずかに速くなる可能性があることを意味します。

しかし、ランタイムがヒントを無視しても何もしないという保証はありません。私は自分自身initWithCapacity:を使用しません。 addObject:がパフォーマンス上のボトルネックになっている状況に遭遇した場合、状況が改善するかどうか試してみることがあります。

+1

右またはそれをぼんやりと置く:ヒント付きのバージョンを気にしないでください。 – bbum