2009-11-13 4 views
10

私はどちらを使うべきですか? 違いを説明してください。NSMutableArray -init対+ arrayWithCapacity:

A:

- (NSMutableArray *)FunctionA:(int)count { 

    NSMutableArray *a = [[NSMutableArray alloc] init]; 

for (int i = 0; i < count; i++) { 
    [a addObject:[NSNumber numberWithInt:0] ]; 
    } 

    return [a autorelease]; 
} 

B:

答えて

28
-(NSMutableArray *)FunctionB:(int)count { 

NSMutableArray *b = [NSMutableArray arrayWithCapacity:count]; 

for (int i=0;i<count; i++){ 
    [b addObject:[NSNumber numberWithInt:0] ]; 
} 

return b; // or [b autorelease] ? 
} 

最初の容量を指定せずに変更可能なアレイを作成します。これにより、アイテムを追加するときに配列が大きくなる必要があります。内部的には、これはおそらく "一度にチャンク(chunkks)"が発生するように大いに最適化されていますが、配列を拡張して項目を追加するときにさらにスペースを割り当てる必要があります。

2番目のヒントは、既知の数のオブジェクトを追加するときにアレイを拡張するオーバーヘッドを避けるためにヒントを与えます(おそらく "この多くの部屋"が必要になります)。もちろん、必要に応じて(容量を指定していないかのように)さらに大きくなります。事前に数を知っている場合は、この方法を使用する必要があります。それはより速く、大量にカウントされます。

これは、最適化する前に測定していないと、欠点があります。容量が非常に大きいが常にその容量を使用するとは限らない可変アレイを作成している場合は、 。

また、initで可変配列を作成しなかったので、(あなたがコメントアウトしたように)Bを自動リリースしません - あなた自身が行う便利な方法を使用しました。つまり、あなたはそれを解放する責任を負いません。準備ができたら、それを解放...

[[NSMutableArray alloc] initWithCapacity:capacity];

:私はあなたの質問に別の答えにコメントで述べたように、あなたはまたして配列を作成することができます。これにより、自動解放プールを使用する場合よりもメモリ使用量を大幅に制御できるようになります。これはiPhoneプラットフォームでの重要な考慮事項です。

ただし、最初に測定し、必要に応じて最適化してください。

1

変更可能なオブジェクトは、10個のオブジェクトに対してデフォルト量を割り当てるようにスペースを割り当てる必要があります。 11を追加すると、変更可能な配列は新しいメモリを割り当て、新しいメモリにアイテムをコピーして、古いメモリを解放する必要があります。

これは通常は非常に速く、気付かないうちに遅くなる可能性があります。サイズの変更可能な配列を作成すると、指定されたサイズの配列が最初に作成されるので、サイズ変更が少なくなることがあります。

1

+alloc-initを使用して作成するため、最初の例ではアレイのメモリを管理する必要があります(そのため、-autoreleaseを送信する必要があります)。

2番目の例では、配列のメモリを管理する必要はありません。これは、(簡単な方法で作成したため)自動リリースされたためです。また、配列の先頭に必要なサイズを指定するので、より効率的になる可能性があります。

自動レンダリングされた配列を返す場合は、+arrayWithCapacity:がすでに自動リリースされた配列を返すため、2番目のオプションがおそらくより望ましいでしょう。また返された配列はすでにオートレリースされているので、自分で-autoreleaseを送る必要はありません。

さらにメモリ管理に不安がある場合は、Apple Memory Management Guidelinesを読むことが必須です。

0

私はBを使用したい:

私はそれを見プラスは、それはあなたのために、より大きな

  • arrayWithCapacity:自動解放を成長に合わせて、あなたがいないので、配列のサイズを変更する必要はありません

    • ですこれは、コードの可読性を改善します。

    私は助けてくれることを望みます。

  • +0

    さらに多くの制御(使用しているメモリ量以上)が必要な状況でも、[[NSMutableArray alloc] initWithCapacity:c]を使用してそれを作成しておくことができます。 –

    +0

    これまでのコメントを明確にするために、これはiPhoneの重要な考慮事項です。これは「iphone」タグのために言及しています。 :-) –

    +0

    絶対に真です。私はタグに気づいていないし、これは大きな配列であると仮定すると重大な考慮事項かもしれない。 しかし、メモリ管理のガイドラインには理由があります。一貫性のある使用法は非常に重要であり、理由を絶対に知っていれば、壊れてしまいます。 –