Copia de una NSArray que no hace lo que esperaba

Tengo un NSMutableArray que estoy pasando a un tableViewController. El usuario accederá y actualizará los datos en la matriz. Agregar objects y eliminar objects.

Para poder volver al estado de la matriz antes de que el usuario interactúe con ella, pensé que haría una copy de la matriz. De esa forma, si el usuario decidió cancelar y no seguir adelante, podría pasar el copyArray nuevamente a la matriz original.

Sin embargo, cuando actualizo algunos datos en la matriz original, también se actualiza en la matriz de copys.

Y no, no los asigné el uno al otro. Utilicé el siguiente código.

array2 = [array1 copy]; 

Incluso he probado el a larga distancia.

 NSMutableArray *newArray = [[NSMutableArray alloc] initWithArray:oldArray copyItems:YES]; 

Pero si configuro copyItems en YES, la aplicación se bloquea con este error.

* Terminar la aplicación debido a la exception no detectada 'NSInvalidArgumentException', razón: '- [SaleItem copyWithZone:]: selector no reconocido enviado a la instancia 0xa21f3b0'

Debería search la diferencia entre una copy profunda y una copy superficial de una matriz. En resumen, ¿quieres solo una copy de las estructuras de datos o quieres copys de los elementos en la matriz también? (¿Deben el original y la copy apuntar a los mismos objects?)

Para resolver este error:

  • Finalización de la aplicación debido a la exception no detectada 'NSInvalidArgumentException', motivo: '- [SaleItem copyWithZone:]: selector no reconocido enviado a la instancia 0xa21f3b0'

También debe implementar NSCopying en su class SaleItem .

Hacer una "copy" de un NSArray (o init una nueva matriz del anterior) solo le dará una nueva matriz que contiene pointers a los mismos objects que la primera matriz, no a las copys de esos objects. Según una respuesta a otra pregunta sobre Stack Overflow , puede usar:

 NSMutableArray *newArray = [[NSMutableArray alloc] initWithArray:oldArray copyItems:YES]; 

para copyr los elementos de primer nivel (suponiendo que implementen NSCopying ), aunque eso puede o no ser suficiente para sus propósitos, dependiendo de cuáles sean esos objects. Esa pregunta a la que he conectado tiene más respuestas sobre hacer una copy "profunda" de un NSArray .