NSMutableArray: addObject "null"?
Ich bin mit beunruhigenden hinzufügen "null" am Ende ein array, bekomme ich "NSInvalidArgumentException" ?
NSMutableArray *k = [NSMutableArray arrayWithCapacity:10];
for (int i=0; i<9; i++){
[k addObject: @"blank"];
}
[k addObject: nil]; //<-- NSInvalidArgumentException
Ich alles tun müssen, dieses Element für Element in einer Schleife und fügen Sie die "null".
Dank
(Da bin ich dann mit der Einnahme dieses array und initialisieren ein 2D-array.
Das problem ist, dass ich nicht erfolgreich "replaceObjectAtIndex" mit einem array ohne "null".
Wenn Baue ich das "k" mit "initWithObjects: @"leer", @"leer", @"leer", ... gleich null", das wird funktionieren. Allerdings schreiben 1000 blanks ist ein wenig viel. So, das ist der Sinn der Schleife.)
//////HIER WIRD DIE TRIAL-AND-ERROR-CODE für init-und Gebäude-und 2D-Matrix-für die Zwecke der das Lesen und speichern einer matrix aus einer "CSV-Datei" //////
///*
NSMutableArray *ppp = [NSMutableArray arrayWithCapacity:2];
NSMutableArray *kkk = [NSMutableArray arrayWithCapacity:20];
NSNull *myNull = [NSNull null];
for (int i=0; i<9; i++) {
//[kkk addObject: [NSMutableString stringWithFormat: @"%d",i]];
[kkk addObject: myNull];
}
//[kkk addObject: nil];
[ppp addObject:kkk];
[ppp addObject:kkk];
//*/
/*
//this is successful --> just uncomment this block and comment out the block above
[ppp addObject:[[NSMutableArray alloc] initWithObjects:
@"z1",
@"z2",
@"z3",
@"z4",
@"z5",
@"z6",
@"z0gg",
@"z0hh",
@"z0ii",
@"z0jj",
nil
]];
[ppp addObject:[[NSMutableArray alloc] initWithObjects:
@"a1",
@"b2",
@"c3",
@"d4",
@"e5",
@"f6",
nil
]];
*/
[[ppp objectAtIndex:0] replaceObjectAtIndex:1 withObject:@"HOTDOG"];
[[ppp objectAtIndex:1] replaceObjectAtIndex:1 withObject:@"HOHO"];
//HOHO will replace HOTDOG as well for the code not using "nil"
- Dies kann ein Duplikat der how to add nil zu nsmutablearray?
- In
initWithObjects
nil wird nicht Teil des Arrays. Überprüfen Sie bitte meine Antwort. - Sie können so viele
NSNull
Objekte im array, wie Sie wollen. EinNSNull
Instanz ist nur ein weiteres Objekt, soweit die mutable-array ist besorgt. - Wenn Baue ich das "k" mit "initWithObjects: @"leer", @"leer", @"leer", ... gleich null", das wird funktionieren. (in der NSMutableArray)
- Wieder:
initWithObjects: @"blank", @"blank", @"blank", ... nil
null ist nicht Teil des Arrays. - Sie kann stattdessen füllen Sie das array mit
NSNull
verweist, anstattNSString
s. Wenn Sie ein array mit 1000 Rohlinge, dann denke ich, Sie bekommen eine kleinere array Weg. - Nur aus Neugier, welche Art von Ding steckst du in dieses array, wenn Sie verwenden
-replaceObjectAtIndex:
? Vielleicht gibt es einen besseren Weg, dies zu tun. - aber für einige Grund, "null" macht den ganzen Unterschied in der Welt wenn ich diese Spalte und bauen eine 2d-matrix mit ihm. Wenn ich Schreibe auf ein Stück, alle "Elemente" zu ändern, dass "ein Element". Aber wenn ich mit "null" in dem Aufbau einer Spalte, die ich erfolgreich schreiben nur eine "Sache."
- Natürlich. Wenn Sie schreiben, 10-Literale, Sie haben 10 verschiedene Objekte. Wenn Sie fügen Sie dann in einer Schleife, die 10 Objekte auf das gleiche literal. Aber ich werde einmal festhalten: in
initWithObjects: @"blank", @"blank", @"blank", ... nil
null ist nicht nicht nicht Teil des Arrays. - Ich lese eine CSV-spreadsheet-Datei und beim analysieren der Zeichenfolge in eine matrix
- wieder... ich habe das getan mit einem NSMutableArray mit und ohne "null". Nicht mit "nil" schlägt fehl!
- Ja, müssen Sie eine null als Letzte argument, aber das null ist nur ein marker-Wert an das Ende der Liste, der nil ist nicht im array gespeichert.
- Velthuis: Upvoting, weil ich will nicht sagen, dass wieder 🙂
- LOL! Ich will nicht sagen, dass es wieder entweder.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht fügen Sie
nil
zu einemNSMutableArray
, und Sie wird eine Ausnahme ausgelöst, wenn Sie versuchen,.Gibt es
NSNull
aber:Fragen Sie sich vielleicht, warum man versucht, dies zu tun, aber.
-addObject:
Methode ist ein bisschen unklar benannt. Du bist nicht hinzufügen, eine eindeutige Kopie der Objekt-array, fügen Sie ein reference, um das Objekt (in ObjC-sprechen, Sie Erhöhung Ihrer retain count um eins). Und so, wenn Sie ändern, was in der Referenz, es wird sich ändern, für was auch immer verweist. In anderen Worten, durch das tun dies zweimal:[ppp addObject:kkk];
Sie hinzufügen, zwei Referenzen vonkkk
zuppp
. Wenn Sie ändernkkk
imppp
's "erste" Objekt mit der-replaceObjectAtIndex:
Methode, diese änderung wirkt sich auf das, was die "zweite"kkk
hält (es ist wirklich nur einkkk
).kkk2
und konstruieren und ändern Sie es ähnlich, nach dem hinzufügen derppp
mutable-array. Dann sehen Sie, wie es sich verhält. Er sich Verhalten sollte, als ob es einzigartig ist, weil es ist ein separates Objekt (und nicht als eine zweite Referenz auf dasselbe Objekt).Brauchen Sie nicht eine null als letztes element in einem array.
Nicht zu verwechseln Sie sich mit variadischen Methoden wie
+arrayWithObjects:
erhalten, die eine flexible Anzahl von Argumenten, und müssen dann feststellen, welches das Letzte war. Das ist, weil in diesen Methoden die Umsetzung (wie auch in variadic-C-Funktionen) Sie können nicht abgerufen werden die Anzahl der Argumente übergeben, also null markiert das Ende.Als Allgemeine Regel, können Sie nest Schleifen in der gleichen Menge wie Ihre Abmessungen. In Ihrem Fall ist das füllen ein 2D-array mit unterschiedlichen Objekten:
ppp
. Alsoppp
enthält 2 sets von 10 Objekten. Diese 10 Objekte sind gleichen in beiden arrays. Die Objekte sind nicht "kopiert", deren Referenzen kopiert. Im zweiten Fall, Sie haben verschiedene Objekte. Genauer gesagt, erstellt Sie 2 sets von verschiedenen Objekten. Es ist nicht im Zusammenhang, ob die null enthalten war oder nicht. Wieder, der nil ininitWithObjects
ist nicht Teil des Arrays.nil
zu variadischen Funktionen.Dürfen Sie gleich null .. ( und Sie nicht ).