2012-04-15 7 views
1

In einem Buch, sehe ich den Code:In Objective-C, wenn addObjectAtIndex aufgerufen wird, um das Array zu erstellen, muss initWithCapacity aufgerufen werden?

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

und lassen Sie uns sagen [masterWordList count] 15. und dann baute der Code das Array, indem Sie eine Schleife für 10-mal mit:

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

Ich frage mich, Warum muss wordsinitWithCapacity ... und 15 Slots sein? Kann es nicht 10 oder 11 sein (wenn ein Nil am Ende benötigt wird ... und auch, wird nicht addObject automatisch die Array-Größe wachsen? Ich habe versucht mit init anstelle von initWithCapacity und der Code funktioniert auch. So kann der Code in dem Buch nur init?

Antwort

4

initWithCapacity: gibt einfach dem Klasseninitialisierer einen "Hinweis" auf die mögliche Größe des Arrays. Auf diese Weise kann es genügend Speicherplatz im Voraus reservieren, wenn Sie wissen, dass Sie es brauchen werden. Die Verwendung von initWithCapacity: kann theoretisch für eine bessere Leistung sorgen, da dies bedeuten kann, dass das Array Speicher (intern) nicht neu zuweisen muss, wenn Sie Objekte hinzufügen (ich weiß nicht, ob dies tatsächlich in der aktuellen Implementierung geschieht, aber es ist möglich)). Wie du schon vermutet hast, ist es nur ein Hinweis und die Verwendung von initWithCapacity: ist völlig optional. Nur weil Sie initWithCapacity: eine bestimmte Größe angegeben haben, bedeutet das nicht, dass Ihr Array nicht mehr Elemente enthalten kann. Außerdem funktioniert das Telefonieren init stattdessen gut.

+1

Genau. Ich würde empfehlen, "-init" zu verwenden, es sei denn, das Profilieren zeigt, dass das Einfügen von Objekten viel Zeit in Anspruch nimmt.(Dies ist nicht rein theoretisch - ich musste '-initWithCapacity:' aus Gründen der Geschwindigkeit ... einmal verwenden.) – andyvn22

3

vereinfacht werden frage ich mich, warum Worte initWithCapacity sein muss ... und zu 15 Slots?

Tatsächlich initWithCapacity:generally not necessary at all ist. Es may or may not Reserveraum in einem nützliche Art. Mein Verständnis ist, dass es etwas von einem historischen Anhängsel ist.

Kann es 10 oder 11 nicht (wenn ein nil am Ende benötigt wird, ...)

Es 10. Wie on your other question erwähnt sein könnte, nilist nicht Teil der Array. Es ist nur ein Sentinel-Wert für den Aufruf der Erstellungsmethode selbst - es ist kein Objekt und wird kein Mitglied der Sammlung.

auch, wird nicht addObject: automatisch die Array-Größe wachsen?

Ja wird es; Sie können ein veränderbares Array erstellen, ohne eine Startgröße anzugeben, und es wird nach Bedarf wachsen.

Kann also der Code im Buch einfach auf init vereinfacht werden?

Ja.

+0

danke für deine antwort. Ich akzeptierte Andrews Antwort für die Erwähnung, dass es ein Mechanismus ist, der einen Hinweis liefert, so dass die Größe nicht jedes Mal aus Leistungsgründen dynamisch wachsen muss. –

Verwandte Themen