-(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プラットフォームでの重要な考慮事項です。
ただし、最初に測定し、必要に応じて最適化してください。
さらに多くの制御(使用しているメモリ量以上)が必要な状況でも、[[NSMutableArray alloc] initWithCapacity:c]を使用してそれを作成しておくことができます。 –
これまでのコメントを明確にするために、これはiPhoneの重要な考慮事項です。これは「iphone」タグのために言及しています。 :-) –
絶対に真です。私はタグに気づいていないし、これは大きな配列であると仮定すると重大な考慮事項かもしれない。 しかし、メモリ管理のガイドラインには理由があります。一貫性のある使用法は非常に重要であり、理由を絶対に知っていれば、壊れてしまいます。 –