Comment convertir NSMutableArray en NSArray en objectif-c ?
NSArray *array = [mutableArray copy];
Copy
effectue des copies immuables. Ceci est très utile car Apple peut effectuer diverses optimisations. Par exemple, l'envoi de copy
à un tableau immuable ne conserve que l'objet et renvoie self
.
Si vous n'utilisez pas de récupération de place ou d'ARC, rappelez-vous que -copy
conserve l'objet.
Un NSMutableArray
est une sous-classe de NSArray
, vous n'aurez donc pas toujours besoin de convertir, mais si vous voulez vous assurer que le tableau ne peut pas être modifié, vous pouvez créer un NSArray
. ces manières selon si vous le voulez autoreleased ou pas:
/* Not autoreleased */
NSArray *array = [[NSArray alloc] initWithArray:mutableArray];
/* Autoreleased array */
NSArray *array = [NSArray arrayWithArray:mutableArray];
EDIT: La solution fournie par Georg Schölly est une meilleure façon de le faire et beaucoup plus propre, surtout maintenant que nous avons ARC et n’a même pas besoin d’appeler autorelease.
J'aime les deux solutions principales:
NSArray *array = [NSArray arrayWithArray:mutableArray];
Ou
NSArray *array = [mutableArray copy];
Les différence principale j'y vois c'est comment ils se comportent quand mutableArray est nul:
NSMutableArray *mutableArray = nil;
NSArray *array = [NSArray arrayWithArray:mutableArray];
// array == @[] (empty array)
NSMutableArray *mutableArray = nil;
NSArray *array = [mutableArray copy];
// array == nil
vous essayez ce code ---
NSMutableArray *myMutableArray = [myArray mutableCopy];
et
NSArray *myArray = [myMutableArray copy];
Voici comment convertir NSMutableArray en NSArray:
//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;
Dans Swift 3.0, un nouveau type de données est créé: Array . Déclarez Array en utilisant let
le mot clé devient NSArray et si vous déclarez en utilisant var
mot clé alors il devient NSMutableArray .
Exemple de code:
let newArray = oldArray as Array
Dans objectif-c:
NSArray *myArray = [myMutableArray copy];
Dans Swift:
var arr = myMutableArray as NSArray
NSArray *array = mutableArray;
Cet [mutableArray copy]
antipattern est un exemple de code. Arrêtez de le faire pour les tableaux mutables jetables qui sont transitoires et désalloués à la fin de l'étendue actuelle.
Il est hors de question que le moteur d'exécution optimise la copie inutile d'un tableau mutable qui est sur le point de sortir de son cadre, décrypté à 0 et désalloué pour de bon.
Si vous construisez un tableau via mutability et souhaitez ensuite renvoyer une version immuable, vous pouvez simplement renvoyer le tableau mutable sous la forme d'un "NSArray" via un héritage.
- (NSArray *)arrayOfStrings {
NSMutableArray *mutableArray = [NSMutableArray array];
mutableArray[0] = @"foo";
mutableArray[1] = @"bar";
return mutableArray;
}
Si vous "faites confiance" à l'appelant pour qu'il traite l'objet de retour (encore techniquement modifiable) comme un objet NSArray immuable, il s'agit d'une option moins coûteuse que [mutableArray copy]
.
Pour déterminer s’il peut modifier un objet reçu, le destinataire d’un message doit s’appuyer sur le type formel de la valeur de retour. S'il reçoit, par exemple, un objet tableau typé comme immuable, , il ne doit pas tenter de le muter . La programmation n'est pas une pratique acceptable pour déterminer si un objet est modifiable en fonction de son appartenance à une classe.
La pratique ci-dessus est discutée plus en détail ici:
Meilleure pratique: Renvoyez mutableArray.copy ou mutableArray si le type de retour est NSArray
j'étais à la recherche de la réponse dans Swift 3 et cette question a été affichée comme premier résultat à la recherche et je me suis inspiré de la réponse, voici donc le code Swift 3
let array: [String] = nsMutableArrayObject.copy() as! [String]