web-dev-qa-db-fra.com

Comment convertir NSMutableArray en NSArray?

Comment convertir NSMutableArray en NSArray en objectif-c ?

373
marcy
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.

496
Georg Schölly

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.

359
hallski

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
112
Richard Venable

vous essayez ce code ---

NSMutableArray *myMutableArray = [myArray mutableCopy];

et

NSArray *myArray = [myMutableArray copy];
18
Jerry Thomsan

Objectif c

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;

Swift

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
4
Sakir Sherasiya

Dans objectif-c:

NSArray *myArray = [myMutableArray copy];

Dans Swift:

 var arr = myMutableArray as NSArray
3
Vikram Biwal
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.

2
Anton Tropashko

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].

Apple est d'accord:

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

1
pkamb

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]
0
Amr Angry