NSMutableArray arrayWithCapacity: Sinn des Ganzen?

cropfaktor

Aktives Mitglied
Thread Starter
Mitglied seit
18.01.2008
Beiträge
1.148
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
 

iCode

Mitglied
Mitglied seit
21.02.2008
Beiträge
566
Grund: Um eine Begrenzung abzubilden.
 

bombard

Mitglied
Mitglied seit
25.12.2008
Beiträge
233
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?
 

oneOeight

Aktives Mitglied
Mitglied seit
23.11.2004
Beiträge
55.824
eventuell ist es auch eine speicher und laufzeit optimierung?
 

Toobles

unregistriert
Mitglied seit
01.06.2007
Beiträge
216
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.
 

redweasel

Aktives Mitglied
Mitglied seit
03.08.2010
Beiträge
2.201
@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.
:)
 

cropfaktor

Aktives Mitglied
Thread Starter
Mitglied seit
18.01.2008
Beiträge
1.148
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
 

_ebm_

Aktives Mitglied
Mitglied seit
19.01.2008
Beiträge
2.079
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.
 

below

Aktives Mitglied
Mitglied seit
15.03.2004
Beiträge
13.564
Es handelt sich weder um eine Mindest-, noch um eine Maximalgröße: Der angegebene Wert wird zur Optimierung verwendet.

Alex
 

redweasel

Aktives Mitglied
Mitglied seit
03.08.2010
Beiträge
2.201
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.
 

below

Aktives Mitglied
Mitglied seit
15.03.2004
Beiträge
13.564
Die Runtime, nicht der Compiler ;)

Alex
 
Oben