Comment puis-je convertir des NSMutableArray de NSArray?
Comment puis-je convertir des NSMutableArray de NSArray dans objective-c?
- juste
NSArray *array = [mutableArray copy];
NSArray *array = mutableArray;
- le béryllium: Absolument droit. vladof81: bien sûr que non.
Vous devez vous connecter pour publier un commentaire.
Copier
fait immuable des copies. C'est très utile parce que Apple peut faire de diverses optimisations. Par exemple pour envoyer descopy
à un immuable tableau ne retient que l'objet et retourneself
.Si vous n'utilisez pas de collecte des ordures ou d'un ARC rappelez-vous que
-copy
conserve l'objet.copy
crée un normal NSArray et pas un NSMutableArray?NSArray
&NSMutableArray
,NSString
&NSMutableString
. Mais pas, par exemple,NSViewController
qui contient toujours mutable état.Un
NSMutableArray
est une sous-classe deNSArray
de sorte que vous n'aurez pas toujours besoin de convertir, mais si vous voulez vous assurer que le tableau ne peut pas être modifié, vous pouvez créer unNSArray
l'une de ces manières, selon que vous voulez qu'il autoreleased ou pas:EDIT: La solution fournis par Georg Schölly est une meilleure façon de le faire et beaucoup plus propre, surtout maintenant que nous avons de l'ARC et de ne même pas avoir à appeler autorelease.
J'aime les 2 solutions principales:
Ou
La principale différence je vois en eux est de savoir comment ils se comportent quand mutableArray est nul:
[mutableArray copy]
peut être simplifié à[nil copy]
. En objective-c aucun message envoyé à néant sera toujours nul. Il est important de rappeler la distinction entre "rien" et "un tableau avec rien dedans".vous essayez ce code---
et
Objective-C
Ci-dessous est la façon de convertir NSMutableArray de NSArray:
Swift
Dans Swift 3.0 il y a un nouveau type de données Tableau. Déclarer un Tableau avec
let
mot-clé, alors il deviendrait NSArray Et si la déclarer à l'aide devar
mot-clé, c'est devenu NSMutableArray.Exemple de code:
Array
s etNSArray
/NSMutableArray
s. Ils ne sont pas les mêmes.En objective-c :
Dans swift :
Ce
[mutableArray copy]
antipattern est tout au plus un exemple de code. Cesser de le faire pour du jetable mutable tableaux qui sont transitoires et désallouées à la fin du présent champ d'application.Il n'y a aucun moyen de l'exécution d'optimiser le gaspillage de la copie d'une mutable tableau qui est sur le point d'aller hors de portée, decrefed à 0 et libéré pour de bon.
NSMutableArray
à unNSArray
variable ne sera pas le convertir (ce qui est le cas des OP question est sur). Exposer une telle valeur (par exemple une valeur de retour ou de propriété) pourrait entraîner très dur pour déboguer les problèmes si cette valeur a été muté de façon inattendue. Cela s'applique à la fois interne et externe mutations depuis la mutable valeur est partagée.NSMutableArray
variable est assez. Depuis l'objet de jamais cessé d'être une mutable tableau, l'appel de la mutation des méthodes, il va réussir et de muter les données partagées. En revanche, si l'original mutable tableau a été copié un immuable de la matrice, puis assigné à unNSMutableArray
variable et a une mutation des méthodes appelé sur elle, ces appels échouerait avecdoesNotRespondToSelector
des erreurs parce que l'objet qui a reçu la mutation de l'appel de méthode est en fait immuable et ne répond pas à ces méthodes.Si vous êtes à la construction d'un tableau via la mutabilité et que vous souhaitez retourner un immuable version, vous pouvez simplement retourner les mutable tableau comme un "NSArray" via l'héritage.
Si vous "confiance" en l'appelant pour traiter l' (techniquement toujours mutable) rendement de l'objet comme une immuable NSArray, c'est une option moins coûteuse que
[mutableArray copy]
.Apple est d'accord:
La pratique ci-dessus est discuté plus en détail ici:
Meilleure Pratique: Retour mutableArray.copie ou mutableArray si le type de retour est NSArray
j'ai été chercher la réponse à swift 3 et cette question a été montré comme premier résultat de recherche et j'ai trouver de l'inspiration, la réponse de il
voici donc la swift 3 code