¿Cómo usar la propiedad "copyr" en Objective-C?

He leído muchos materiales en línea que explican cuando las personas deben usar " copy " en lugar de " strong ".

"El atributo de copy es una alternativa al fuerte. En lugar de asumir la propiedad del object existente, crea una copy de lo que asigne a la propiedad, luego se hace cargo de ella. Solo los objects que cumplen con el protocolo NSCopying pueden usar este atributo. … "

Y hay muchos códigos de ejemplo que muestran cuando se usa "copyr", el valor original permanece igual.

Sin embargo, soy nuevo en Objective-C . Realmente quiero saber cómo usar el valor asignado recientemente. ¿Dónde está la "nueva instancia (copy)" con el "nuevo valor"? ¿Necesito algún método adicional para cambiar el valor original si así lo deseo?

Será fantástico si alguien puede compartir un ejemplo para esta parte, no el que demuestra que el valor original no se modifica, que está en todas partes.

Una instancia de una class es una copy discreta. Cuando asigna una instancia de una class para que sea el valor de una propiedad con el atributo de copy , se crea un clon de esa instancia y ese clon se convierte en el valor de la propiedad. No hay relación entre el original y su clon, por lo que la propiedad no tiene acceso a la instancia original. Cambiar el atributo del valor de la propiedad cambia el clon.

Nota:

Si implementa el setter para una propiedad de copy , es su responsabilidad asegurarse de que realmente cree una copy. Como es cierto con todos los attributes de una propiedad, solo tienen significado cuando el comstackdor está generando (sintetizando) el configurador y / o getter para usted.

Lo que hace el atributo de copy detrás de escena es crear un configurador como este:

 - (void)setMyCopiedProperty:(MyClass *)newValue { _myCopiedProperty = [newValue copy]; } 

esto significa que cada vez que alguien hace algo como este object.myCopiedProperty = someOtherValue; , someOtherValue recibe un post de copy que le indica que se duplique. El receptor obtiene entonces un nuevo puntero (suponiendo que la copy se implementa correctamente), a la que nadie, excepto el object receptor, tiene acceso.

Puede ver la copy como exclusiva de alguna manera:

  • los clientes que configuran la propiedad no tienen acceso al valor establecido real
  • el receptor no tiene acceso al valor original pasado.

Cuidado con las advertencias, sin embargo:

  • un NSArray copydo no copy sus objects, por lo que podría terminar pensando que una @property(copy) NSArray<MyClass *> *myProperty es segura, sin embargo, mientras que la matriz en sí misma está segura de ser modificada, los objects retenidos por la matriz comparte la misma reference Lo mismo es cierto para cualquier class de colección ( NSDictionary , NSSet , etc.)
  • si la propiedad coincide con una class personalizada, debe asegurarse de que el método de copy sea ​​su trabajo, es decir, crear un nuevo object. Esto es cierto para todas las classs de Cocoa / CocoaTouch que se ajustan a NSCopying , sin embargo, para otras classs esto podría o no ser cierto, dependiendo de la implementación (yo mismo no vi una class que mienta sobre su método de copy , sin embargo nunca se sabe)

Dupdo :

Se requiere una copy cuando el object es mutable. Use esto si necesita el valor del object tal como está en este momento, y no desea que ese valor refleje los cambios realizados por otros propietarios del object. Deberá liberar el object cuando termine con él porque está reteniendo la copy.