6

重複の可能性:
NSMutableArrayinitWithCapacityニュアンス
Objective-cNSArray initとinitWithCapacity:0

次のコード行の違いは何ですか?正確な長所と短所は何ですか?次に、3つのaddObject操作を実行するとします。

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

2 に答える 2

8

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

最初のケースでは、5 つのオブジェクトをすぐに配列に追加するというヒントをランタイムに与えているため、必要に応じてそれらのオブジェクトにスペースを事前に割り当てることができます。つまりaddObject:、最初のステートメントを使用すると、最初の 5 回の呼び出しがわずかに速くなる可能性があります。

ただし、実行時にヒントが無視されるという保証はありません。自分は絶対に使いませinitWithCapacity:ん。重大なパフォーマンスのボトルネックが発生する状況に陥った場合addObject:は、状況が改善するかどうかを確認するために試してみるかもしれません.

于 2012-08-07T14:27:20.897 に答える
5

通常、オブジェクト指向言語とさまざまなサイズの配列との違いは、発生するオーバーヘッドとメモリ レベルでのページ フォールトです。

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

Appleのドキュメントから:

arrayWithCapacity:

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

于 2012-08-07T14:26:59.100 に答える