NSMutableArray arrayWithCapacity: Sinn des Ganzen?

cropfaktor

cropfaktor

Aktives Mitglied
Thread Starter
Dabei seit
18.01.2008
Beiträge
1.148
Reaktionspunkte
119
Experimentiere derzeit mit einem NSMutableArray:
Code:
NSMutableArray *array = [NSMutableArray arrayWithCapacity: 3];
Die Initialisierung des Arrays ist mir soweit klar.
Die Zahl "3", die hier als Parameter übergeben wird, dient wohl dazu, Platz zu reservieren, was in meinen Augen Schwachfug ist, da dass Array den Speicherplatz beim dynamischen Hinzufügen selbst alloziert.
Da kann ich jeden x-beliebigen Wert angeben und es funktioniert trotzdem alles.

Gibt es da einen Grund für, oder dient dies nur der Codehygiene?

Danke für ne Info
Andreas
 
Grund: Um eine Begrenzung abzubilden.
 
  • Gefällt mir
Reaktionen: cropfaktor
OK, Danke.
 
Hallo,
Eine Begrenzung für die Anzahl der Objekte macht ja schon Sinn. Was passiert eigentlich, wenn man dann mehr als z.B. 3 hinzufügen möchte?
Fehlermeldung oder wird ein anderes gelöscht?
 
  • Gefällt mir
Reaktionen: cropfaktor
eventuell ist es auch eine speicher und laufzeit optimierung?
 
  • Gefällt mir
Reaktionen: cropfaktor
cropfaktor schrieb:
Die Zahl "3", die hier als Parameter übergeben wird, dient wohl dazu, Platz zu reservieren, was in meinen Augen Schwachfug ist, da dass Array den Speicherplatz beim dynamischen Hinzufügen selbst alloziert.

Ja, aber das kostet Zeit. Wenn du von vornherein weißt, wie groß das Array wird sparst du Zeit, wenn du in einem Rutsch den Speicher allokierst, statt immer in kleinen Blöcken. Wobei ich ehrlich gesagt nicht genau weiß, wie sich NSMutableArray verhält. Aber ich würde vermuten, dass das Verhalten ähnlich wie bei den Java-Collections ist, dass also erst ein kleiner Block allokiert wird und wenn dieser voll ist, wird ein weiterer kleiner Block allokiert.
 
  • Gefällt mir
Reaktionen: cropfaktor
@cropfaktor:

Die Entwicklerdokumentation von Apple ist dein Freund. Dort ist nämlich alles schön beschrieben. Es handelt sich dabei lediglich um die Mindestgrösse, welche das Array haben wird. Dabei dürfte es sich tatsächlich einfach um eine Optimierung handeln. Wenn ich bei der Erstellung schon weiss, dass mein Array 20 Items haben wird, dann muss ich das Array ja nicht erst aufwändig um diese 20 Items wachsen lassen.

Aber wie gesagt... Google "NSMutableArray", das erste Resultat st die Klassendokumentation von Apple und dort steht alles drin.
http://developer.apple.com/library/...NSMutableArray_Class/Reference/Reference.html

Mutable arrays expand as needed; numItems simply establishes the object’s initial capacity.

:)
 
  • Gefällt mir
Reaktionen: timo1 und cropfaktor
Danke Euch allen. Hab es kapiert.
@redweasel: Habe seit XCODE 4 so manches Problem mit der Doku. Ich fand die alte besser erreichbar und von der linken Seite her, Navigation, besser und verständlicher.
Ich schaue da leider, muss es mir angewöhnen, nicht mehr so oft nach, weil ich vieles nicht mehr so finde, wie ich es Anfänger gewohnt bin. Später wird es bestimmt besser.

Andreas
 
Wobei ich ehrlich gesagt nicht genau weiß, wie sich NSMutableArray verhält. Aber ich würde vermuten, dass das Verhalten ähnlich wie bei den Java-Collections ist, dass also erst ein kleiner Block allokiert wird und wenn dieser voll ist, wird ein weiterer kleiner Block allokiert.

Bei Java ist es sogar schlimmer. Es wird das Array kopiert. Sprich es wird Speicher in der neuen Größe ausgefasst und dann der alte Inhalt in das neue Array kopiert. Könnte auf Obj-C auch zutreffen.
 
Es handelt sich weder um eine Mindest-, noch um eine Maximalgröße: Der angegebene Wert wird zur Optimierung verwendet.

Alex
 
  • Gefällt mir
Reaktionen: cropfaktor und redweasel
Danke für die Richtigstellung. Der Begriff Mindestgrösse in meinem Post war ziemlich unglücklich gewählt.

Der Wert bereitet das Array lediglich intern darauf vor, eine entsprechende Anzahl Objekte aufnehmen zu können (im Sinne von, der Compiler optimiert den Code entsprechend). Aber man kann natürlich weniger Objekte hinzufügen und das Array ist beinhaltet dann auch nur die effektiven Objekte.

Es ist also nicht so, dass man mit arrayWithCapacity:5 ein Array mit 5 leeren Objekten oder erstellen würde und auch kein Array welches mindestens 5 Objekte beinhalten muss.
 
Die Runtime, nicht der Compiler ;)

Alex
 
Zurück
Oben Unten