Wie konvertiere ich NSMutableArray in NSArray in Ziel c?
NSArray *array = mutableArray;
Wie konvertiere ich NSMutableArray in NSArray in Ziel c?
NSArray *array = mutableArray;
Antworten:
NSArray *array = [mutableArray copy];
Copy
macht unveränderliche Kopien. Dies ist sehr nützlich, da Apple verschiedene Optimierungen vornehmen kann. Zum Beispiel copy
behält das Senden an ein unveränderliches Array nur das Objekt bei und gibt es zurück self
.
Wenn Sie keine Garbage Collection oder ARC verwenden, denken Sie daran, dass -copy
das Objekt erhalten bleibt.
copy
ein normales NSArray und kein NSMutableArray erstellt wird?
NSArray
& NSMutableArray
, NSString
&NSMutableString
. Aber nicht zum Beispiel, NSViewController
der immer einen veränderlichen Zustand enthält.
An NSMutableArray
ist eine Unterklasse von, NSArray
sodass Sie nicht immer konvertieren müssen. Wenn Sie jedoch sicherstellen möchten, dass das Array nicht geändert werden kann, können Sie eine NSArray
der folgenden Methoden erstellen, je nachdem, ob Sie es automatisch freigeben möchten oder nicht:
/* Not autoreleased */
NSArray *array = [[NSArray alloc] initWithArray:mutableArray];
/* Autoreleased array */
NSArray *array = [NSArray arrayWithArray:mutableArray];
EDIT: Die von Georg Schölly bereitgestellte Lösung ist eine bessere Methode und viel sauberer, besonders jetzt, wo wir ARC haben und nicht einmal Autorelease aufrufen müssen.
Ich mag beide 2 Hauptlösungen:
NSArray *array = [NSArray arrayWithArray:mutableArray];
Oder
NSArray *array = [mutableArray copy];
Der Hauptunterschied, den ich in ihnen sehe, ist, wie sie sich verhalten, wenn mutableArray gleich Null ist :
NSMutableArray *mutableArray = nil;
NSArray *array = [NSArray arrayWithArray:mutableArray];
// array == @[] (empty array)
NSMutableArray *mutableArray = nil;
NSArray *array = [mutableArray copy];
// array == nil
[mutableArray copy]
kann dies vereinfacht werden [nil copy]
. In Ziel-c ist jede an nil gesendete Nachricht immer nil. Es ist wichtig, sich an die Unterscheidung zwischen "nichts" und "einem Array mit nichts" zu erinnern.
Sie versuchen diesen Code ---
NSMutableArray *myMutableArray = [myArray mutableCopy];
und
NSArray *myArray = [myMutableArray copy];
Im Folgenden finden Sie eine Möglichkeit, NSMutableArray in NSArray zu konvertieren:
//oldArray is having NSMutableArray data-type.
//Using Init with Array method.
NSArray *newArray1 = [[NSArray alloc]initWithArray:oldArray];
//Make copy of array
NSArray *newArray2 = [oldArray copy];
//Make mutablecopy of array
NSArray *newArray3 = [oldArray mutableCopy];
//Directly stored NSMutableArray to NSArray.
NSArray *newArray4 = oldArray;
In Swift 3.0 gibt es den neuen Datentyp Array . Deklarieren Sie das Array mit dem let
Schlüsselwort, dann wird es zu NSArray . Wenn Sie mit dem var
Schlüsselwort deklarieren, wird es zu NSMutableArray .
Beispielcode:
let newArray = oldArray as Array
In Ziel-c:
NSArray *myArray = [myMutableArray copy];
In Kürze:
var arr = myMutableArray as NSArray
NSArray *array = mutableArray;
Diese [mutableArray copy]
Antimuster enthält den gesamten Beispielcode. Beenden Sie dies für wegwerfbare veränderbare Arrays, die vorübergehend sind und am Ende des aktuellen Bereichs freigegeben werden.
Auf keinen Fall könnte die Laufzeit das verschwenderische Kopieren eines veränderlichen Arrays optimieren, das kurz vor dem Verlassen des Gültigkeitsbereichs steht, auf 0 deklariert und endgültig freigegeben wird.
NSMutableArray
zu einer NSArray
Variablen wird es nicht verdecken (worum es in der Frage des OP geht). Das Anzeigen eines solchen Werts (z. B. als Rückgabewert oder als Eigenschaft) kann zu sehr schwer zu debuggenden Problemen führen, wenn dieser Wert unerwartet mutiert wird. Dies gilt sowohl für interne als auch für externe Mutationen, da der veränderbare Wert gemeinsam genutzt wird.
NSMutableArray
Variablen zuzuweisen. Da das Objekt nie aufgehört hat, ein veränderbares Array zu sein, ist das Aufrufen von Mutationsmethoden erfolgreich und mutiert die gemeinsam genutzten Daten. Wenn andererseits das ursprüngliche veränderbare Array kopiert und in ein unveränderliches Array geändert und dann einer NSMutableArray
Variablen zugewiesen und mit Mutationsmethoden aufgerufen wurde, schlagen diese Aufrufe mit doesNotRespondToSelector
Fehlern fehl , da sich das Objekt befindet, in dem sich der Aufruf der Mutationsmethode befindet Tatsache unveränderlich und reagiert nicht auf diese Methoden.
Wenn Sie ein Array über Veränderbarkeit erstellen und dann eine unveränderliche Version zurückgeben möchten, können Sie das veränderbare Array einfach als "NSArray" über Vererbung zurückgeben.
- (NSArray *)arrayOfStrings {
NSMutableArray *mutableArray = [NSMutableArray array];
mutableArray[0] = @"foo";
mutableArray[1] = @"bar";
return mutableArray;
}
Wenn Sie dem Aufrufer "vertrauen", dass er das (technisch immer noch veränderbare) Rückgabeobjekt als unveränderliches NSArray behandelt, ist dies eine billigere Option als [mutableArray copy]
.
Um festzustellen, ob ein empfangenes Objekt geändert werden kann, muss sich der Empfänger einer Nachricht auf den formalen Typ des Rückgabewerts verlassen. Wenn es beispielsweise ein als unveränderlich eingegebenes Array-Objekt empfängt, sollte es nicht versuchen, es zu mutieren . Es ist keine akzeptable Programmierpraxis, anhand seiner Klassenmitgliedschaft festzustellen, ob ein Objekt veränderbar ist.
Die obige Praxis wird hier ausführlicher erörtert:
Ich war auf der Suche nach der Antwort in Swift 3 und diese Frage wurde als erstes Ergebnis in der Suche angezeigt und ich werde von der Antwort inspiriert, also hier ist der Swift 3-Code
let array: [String] = nsMutableArrayObject.copy() as! [String]
NSArray *array = [mutableArray copy];