objective-c cocoa-touch cocoa nsmutablearray nsarray

objective c - ¿Cómo convierto NSMutableArray a NSArray?



objective-c cocoa-touch (9)

C objetivo

A continuación se muestra la forma de convertir NSMutableArray a 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;

Rápido

En Swift 3.0 hay un nuevo tipo de datos Array . Declare Array usando let keyword, luego se convertiría en NSArray Y si declara usar var keyword, se convierte en NSMutableArray .

Código de muestra:

let newArray = oldArray as Array

¿Cómo convierto NSMutableArray a NSArray en object objective-c ?


Busqué la respuesta en swift 3 y esta pregunta se mostró como primer resultado en la búsqueda y me inspiré en la respuesta, así que aquí está el código swift 3.

let array: [String] = nsMutableArrayObject.copy() as! [String]


Me gustan las dos soluciones principales:

NSArray *array = [NSArray arrayWithArray:mutableArray];

O

NSArray *array = [mutableArray copy];

La principal diferencia que veo en ellos es cómo se comportan cuando mutableArray es nil :

NSMutableArray *mutableArray = nil; NSArray *array = [NSArray arrayWithArray:mutableArray]; // array == @[] (empty array) NSMutableArray *mutableArray = nil; NSArray *array = [mutableArray copy]; // array == nil


Si está construyendo una matriz mediante mutabilidad y luego desea devolver una versión inmutable, simplemente puede devolver la matriz mutable como "NSArray" a través de la herencia.

- (NSArray *)arrayOfStrings { NSMutableArray *mutableArray = [NSMutableArray array]; mutableArray[0] = @"foo"; mutableArray[1] = @"bar"; return mutableArray; }

Si "confía" en la persona que llama para tratar el objeto de retorno (técnicamente aún mutable) como una NSArray inmutable, esta es una opción más barata que [mutableArray copy] .

Apple está de acuerdo:

Para determinar si puede cambiar un objeto recibido, el receptor de un mensaje debe confiar en el tipo formal del valor de retorno. Si recibe, por ejemplo, un objeto de matriz tipificado como inmutable, no debe intentar mutarlo . No es una práctica de programación aceptable determinar si un objeto es mutable según su pertenencia a la clase.

La práctica anterior se discute con más detalle aquí:

Práctica recomendada: devuelva mutableArray.copy o mutableArray si el tipo de retorno es NSArray


Un NSMutableArray es una subclase de NSArray por lo que no siempre tendrá que convertir, pero si desea asegurarse de que la matriz no pueda modificarse, puede crear un NSArray cualquiera de estas maneras, dependiendo de si desea que se publique automáticamente o no:

/* Not autoreleased */ NSArray *array = [[NSArray alloc] initWithArray:mutableArray]; /* Autoreleased array */ NSArray *array = [NSArray arrayWithArray:mutableArray];

EDITAR: La solución provista por Georg Schölly es una mejor manera de hacerlo y mucho más limpia, especialmente ahora que tenemos ARC y no tenemos que llamar autorelease.


prueba este código ---

NSMutableArray *myMutableArray = [myArray mutableCopy];

y

NSArray *myArray = [myMutableArray copy];


En objetivo-c:

NSArray *myArray = [myMutableArray copy];

En veloz

var arr = myMutableArray as NSArray


NSArray *array = [mutableArray copy];

Copy hace copias inmutables. Esto es bastante útil porque Apple puede hacer varias optimizaciones. Por ejemplo, enviar una copy a una matriz inmutable solo retiene el objeto y se devuelve a self .

Si no utiliza la recolección de basura o ARC, recuerde que la -copy conserva el objeto.


NSArray *array = mutableArray;

Este [mutableArray copy] es todo código de ejemplo. Deje de hacerlo para los arreglos mutables desechables que son transitorios y se desasignan al final del alcance actual.

No hay forma de que el tiempo de ejecución pueda optimizar la copia inútil de una matriz mutable que está a punto de quedar fuera del alcance, decretada a 0 y desasignada para siempre.