1

本の中で、私はコードを見ます:

words = [[NSMutableArray alloc] initWithCapacity:[masterWordList count]];

そして、15だとしましょう[masterWordList count]。そして、コードは10回のループを使用して配列を構築しました。

[words addObject:[masterWordList objectAtIndex:randomNum]];

なぜ...そして15スロットでwordsなければならないのだろうか?initWithCapacity10または11にすることはできません(最後にnilが必要な場合...また、addObject配列サイズが自動的に大きくならない場合は、init代わりに使用してみinitWithCapacityましたが、コードも機能しました。したがって、本のコードも機能します。単純化してinit

4

2 に答える 2

4

initWithCapacity:配列の最終的なサイズに関する「ヒント」をクラス初期化子に与えるだけです。そうすれば、必要になることがわかっている場合は、事前に十分なスペースを割り当てることができます。を使用initWithCapacity:すると、オブジェクトを追加するときに配列が(内部で)メモリを再割り当てする必要がないため、理論的にはパフォーマンスが向上します(現在の実装で実際にこれを行うかどうかはわかりませんが、可能です) 。ご想像のとおり、これは単なるヒントであり、使用initWithCapacity:は完全にオプションです。特定のサイズを指定したからといってinitWithCapacity:、それより多くの要素を保持するように配列を拡張できないわけではありません。また、代わりに呼び出すinitことは問題なく機能します。

于 2012-04-15T21:00:44.657 に答える
3

なぜ単語はinitWithCapacity...そして15スロットでなければならないのだろうか?

実際、通常initWithCapacity:まったく必要ありません。便利な方法でスペースを予約する場合としない場合があります。私の理解では、それは歴史的な付属物のようなものだということです。

10または11にすることはできません(nil最後にaが必要な場合...)

10の可能性があります。他の質問で述べたようにnil 、は配列の一部ではありません。これは、createingメソッド呼び出し自体の単なる番兵値です。オブジェクトではなく、コレクションのメンバーにはなりません。

また、addObject:配列サイズは自動的に大きくなりませんか?

はい、そうなります。開始サイズを指定せずに可変配列を作成でき、必要に応じて拡張されます。

それで、本のコードはただ単純化することができinitますか?

はい。

于 2012-04-15T21:00:27.747 に答える