¿Es cierto que, en Objective-C, los objetos agregados a las colecciones deben ajustarse a NSCopying? ¿Por qué?

^^^ Lo que dijeron ^^^

Y también, si desea serializar toda la matriz, NSKeyedArchiver / Unarchiver espera que sus objetos se ajusten a NSCopying. Creo que esto se debe a que serializa (una copia de) cada objeto individual en lugar de la “matriz de objetos”. Supongo que no es necesario serializar la estructura de datos de la matriz en sí, ya que NSKeyedUnarchiver podría crear una nueva matriz en el otro extremo.

Un caso en el que esto es muy útil es guardar un NSArray / NSMutableArray en CoreData, que no tiene una forma inmediata de hacerlo. Otro lugar que resulta útil es convertir una matriz a plist, nuevamente a través de NSKeyedArchive / Unarchive.

En cuanto a NSValue que no implementa copyWithZone , consulte los documentos:

“La clase abstracta NSValue es la interfaz pública de un grupo de clases que consiste principalmente en clases privadas y concretas que crean y devuelven un objeto de valor apropiado para una situación dada. Es posible subclasificar NSValue, pero hacerlo requiere proporcionar facilidades de almacenamiento para el valor (que no es heredado por las subclases) e implementar dos métodos primitivos “.

Me arriesgaría a adivinar que las “clases privadas y concretas” que componen NSValue implementan copyWithZone , y que afortunadamente se abstrae de usted.

Si observa las notas de subclasificación para NSValue, obtendrá una pista de cómo sucede esto: Referencia de clase de NSValue

Depende de su demanda.

Si envolvió un objeto de clase, eso no tiene una funcionalidad de copia que no debe cumplir con NSCopying.

Si esta clase que usted envolvió necesita una funcionalidad de copia que debe cumplir con NSCopying.

Una cosa que debe saber es que todas las colecciones de arreglos ya se han conformado con los protocolos NSCopying y NSMutableCopying.

La clave para NSDictionary debe ajustarse al protocolo de copia, pero no para el objeto, NSArray no requiere la implementación del protocolo de copia y tampoco NSSet, para NSSet puede que necesite implementar los métodos isEqual: y hash para obtener el resultado desea, si desea que dos instancias diferentes se traten como lo mismo, lo hará; de lo contrario, su objeto se comparará con la dirección en la memoria. Puede usar NSHashTable si no desea que se copien sus claves.

No siempre. Y debe comprender el concepto NSCopying y Protocol antes de preguntar por qué.