@property y retener, asignar, copyr, no atómico en Objective-C

Como alguien nuevo en Objective-C puede alguien darme una descripción general de la retención, asignación, copy y cualquier otra que me falte, que siguen la directiva @property? ¿Qué están haciendo y por qué querría usar uno sobre otro?

El artículo vinculado por MrMage ya no funciona. Por lo tanto, esto es lo que he aprendido en mi (muy) encoding de time corto en Objective-C:

no atómico vs. atómico – "atómico" es el pnetworkingeterminado. Siempre use "nonatomic". No sé por qué, pero el libro que leí dice que "raramente hay una razón" para usar "atómico". (Por cierto: el libro que leo es el libro de BNR "Progtwigción de iOS").

readwrite vs. readonly – "readwrite" es el valor pnetworkingeterminado. Cuando @sintetiza, se crearán tanto un getter como un setter. Si utiliza "readonly", no se creará ningún configurador. Úselo para un valor que no desea cambiar después de la instanciación del object.

retener vs. copyr vs. asignar

  • "asignar" es el valor pnetworkingeterminado. En el setter creado por @synthesize, el valor simplemente se asignará al atributo. Mi entendimiento es que "asignar" debería usarse para attributes que no son pointers.
  • "retener" es necesario cuando el atributo es un puntero a un object. El set generado por @synthesize retendrá (también conocido como un recuento de retención) el object. Deberás liberar el object cuando hayas terminado con él.
  • Se necesita "copyr" 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.

Antes de que sepa sobre los attributes de @property, debe saber cuál es el uso de @property.

  • @property ofrece una forma de definir la información que una class pretende encapsular. Si declara un object / variable usando @property , ese object / variable será accesible para otras classs que importen su class.

  • Si declara un object usando @property en el file de encabezado, entonces debe sintetizarlo usando @synthesize en el file de implementación. Esto hace que el object cumpla con KVC . De forma pnetworkingeterminada, el comstackdor sintetizará methods de acceso para este object.

  • Los methods de acceso son: setter y getter.

Ejemplo: .h

 @interface XYZClass : NSObject @property (nonatomic, retain) NSString *name; @end 

.metro

 @implementation XYZClass @synthesize name; @end 

Ahora el comstackdor sintetizará methods de acceso para el nombre .

 XYZClass *obj=[[XYZClass alloc]init]; NSString *name1=[obj name]; // get 'name' [obj setName:@"liza"]; // first letter of 'name' becomes capital in setter method 
  • Lista de attributes de @property

    atómico, no atómico, retener, copyr, solo leer, escribir, asignar, fuerte, getter = método, setter = método, unsafe_unretained

  • atómico es el comportamiento pnetworkingeterminado. Si un object se declara como atómico, entonces se vuelve seguro para hilos. Seguro de subprocesss significa, en un momento, solo un subprocess de una instancia particular de esa class puede tener el control sobre ese object.

Si el hilo está ejecutando el método getter, entonces otro hilo no puede realizar el método setter en ese object. Es lento.

 @property NSString *name; //by default atomic` @property (atomic)NSString *name; // explicitly declanetworking atomic` 
  • no atómico no es seguro para hilos. Puede usar el atributo de propiedad no atómica para especificar que los accesores sintetizados simplemente configuran o devuelven un valor directamente, sin garantías sobre lo que sucede si se accede al mismo valor simultáneamente desde diferentes subprocesss.

Por esta razón, es más rápido acceder a una propiedad no atómica que a una atómica.

 @property (nonatomic)NSString *name; 
  • Se requiere retención cuando el atributo es un puntero a un object.

El método setter boostá la count retenida del object, de modo que ocupará memory en el set de autorelease.

 @property (retain)NSString *name; 
  • copy Si utiliza la copy, no puede usar retain. El uso de la instancia de copy de la class contendrá su propia copy.

Incluso si se establece una cadena mutable y posteriormente se cambia, la instancia captura el valor que tenga en el momento en que se establece. No se sintetizarán los methods setter y getter.

 @property (copy) NSString *name; 

ahora,

 NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"]; xyzObj.name = nameString; [nameString appendString:@"Pizza"]; 

el nombre no se verá afectado.

  • readonly Si no desea permitir que la propiedad se cambie a través del método setter, puede declarar la propiedad solo.

El comstackdor generará un getter, pero no un setter.

 @property (readonly) NSString *name; 
  • readwrite es el comportamiento pnetworkingeterminado. No es necesario especificar explícitamente el atributo readwrite.

Es opuesto al de solo lectura.

 @property (readwrite) NSString *name; 
  • assign generará un configurador que asigna el valor directamente a la variable de la instancia, en lugar de copyrla o retenerla. Esto es lo mejor para types primitivos como NSInteger y CGFloat, u objects que no posee directamente, como los delegates.

Tenga en count que retener y asignar son básicamente intercambiables cuando se habilita la recolección de basura.

 @property (assign) NSInteger year; 
  • Fuerte es un reemploop para retener.

Viene con ARC.

 @property (nonatomic, strong) AVPlayer *player; 
  • getter = method Si desea usar un nombre diferente para un método getter, es posible especificar un nombre personalizado agregando attributes a la propiedad.

En el caso de las properties booleanas (properties que tienen un valor SÍ o NO), es habitual que el método getter comience con la palabra "is"

 @property (getter=isFinished) BOOL finished; 
  • setter = method Si desea usar un nombre diferente para un método setter, es posible especificar un nombre personalizado agregando attributes a la propiedad.

El método debe terminar con dos puntos.

 @property(setter = boolBool:) BOOL finished; 
  • unsafe_unretained Hay algunas classs en Cocoa y Cocoa Touch que todavía no admiten references débiles, lo que significa que no puede declarar una propiedad débil o una variable local débil para realizar un seguimiento de ellas. Estas classs incluyen NSTextView, NSFont y NSColorSpace, etc. Si necesita usar una reference débil a una de estas classs, debe usar una reference insegura.

Una reference insegura es similar a una reference débil en que no mantiene vivo su object relacionado, pero no se establecerá en nil si el object de destino se desasigna.

 @property (unsafe_unretained) NSObject *unsafeProperty; 

Si necesita especificar varios attributes, simplemente inclúyalos como una list separada por comas, así:

 @property (readonly, getter=isFinished) BOOL finished; 

Después de leer muchos artículos decidí reunir toda la información de los attributes:

  1. atomic // default
  2. no atómico
  3. fuerte = retener // pnetworkingeterminado
  4. débil = unsafe_unretained
  5. conservar
  6. asignar // pnetworkingeterminado
  7. unsafe_unretained
  8. dupdo
  9. solo lectura
  10. readwrite // default

A continuación se muestra un enlace al artículo detallado donde puede encontrar estos attributes.

¡Muchas gracias a todas las personas que dan las mejores respuestas aquí!

Atributos de propiedad variable o Modificadores en iOS

Aquí está la descripción de ejemplo del artículo

  1. atómico -Atomico significa que solo un hilo accede a la variable (tipo estático). -Atomic es seguro para hilos. -pero es lento en el performance -atómico es el comportamiento pnetworkingeterminado -Atomos de acceso en un entorno no recogido de basura (es decir, cuando se usa retener / liberar / autorizar) utilizará un locking para garantizar que otro hilo no interfiera con la configuration / obtención correcta del valor -no es en realidad una palabra key.

Ejemplo:

 @property (retain) NSString *name; @synthesize name; 
  1. nonatomic -Nonatomic significa acceso de subprocesss múltiples a la variable (tipo dynamic). -Nonatomic es hilo inseguro. -pero es rápido en performance -Natatomic NO es un comportamiento pnetworkingeterminado, tenemos que agregar palabras key no atómicas en el atributo de propiedad. : puede dar lugar a un comportamiento inesperado, cuando dos processs diferentes (subprocesss) acceden a la misma variable al mismo time.

Ejemplo:

 @property (nonatomic, retain) NSString *name; @synthesize name; 

Explique:

Suponga que hay una propiedad de cadena atómica llamada "nombre", y si llama [self setName: @ "A"] del hilo A, llame [self setName: @ "B"] del hilo B y llame a [nombre propio] de hilo C, entonces toda la operación en hilo diferente se realizará en serie, lo que significa que si un hilo está ejecutando setter o getter, entonces otros hilos esperarán. Esto hace que la propiedad "nombre" de lectura / escritura sea segura, pero si otro subprocess D llama [liberación de nombre] simultáneamente, esta operación podría producir un locking porque aquí no hay una llamada de setter / getter. Lo que significa que un object es de lectura / escritura segura (ATOMIC), pero no puede ser seguro a medida que otros hilos pueden enviar simultáneamente cualquier tipo de post al object. El desarrollador debe garantizar la security de los hilos para dichos objects.

Si la propiedad "name" no era atómica, todos los hilos en el ejemplo anterior – A, B, C y D se ejecutarían simultáneamente produciendo cualquier resultado impnetworkingecible. En caso de ser atómico, cualquiera de A, B o C se ejecutará primero, pero D aún puede ejecutarse en paralelo.

  1. fuerte (iOS4 = retener): dice "mantén esto en el montón hasta que ya no lo señale", en otras palabras "soy el propietario, no puedes desasociar esto antes de apuntar bien con lo mismo que retener" Utilizas fuerte solo si necesitas conservar el object. -Por defecto, todas las variables de instancia y las variables locales son pointers fuertes. -En general usamos fuerte para UIViewControllers (padres de elementos de la UI) -strong se usa con ARC y básicamente te ayuda, al no tener que preocuparte por el recuento de un object. ARC lo libera automáticamente cuando terminas con él. Usar la palabra key fuerte significa que eres el propietario del object.

Ejemplo:

 @property (strong, nonatomic) ViewController *viewController; @synthesize viewController; 
  1. débil (iOS4 = unsafe_unretained) -it dice "mantén esto siempre y cuando alguien más lo apunte con fuerza" -lo mismo que asignar, no retener ni liberar una "débil" reference es una reference que no retienes. -En general, usamos weak for IBOutlets (UIViewController's Childs). Esto funciona porque el object secundario solo necesita existir siempre que el object principal lo haga. : una reference débil es una reference que no protege el object reference de la recostackción por parte de un recolector de basura. -El debil es esencialmente asignar, una propiedad no retenida. Excepto cuando el object se desasigna, el puntero débil se establece automáticamente en cero

Ejemplo:

 @property (weak, nonatomic) IBOutlet UIButton *myButton; @synthesize myButton; 

Explicación fuerte y débil, gracias a BJ Homer :

Imagina que nuestro object es un perro, y que el perro quiere huir (ser desasignado). Los pointers fuertes son como una correa para el perro. Mientras tenga la correa sujeta al perro, el perro no huirá. Si cinco personas sujetan su correa a un perro, (cinco indicadores fuertes a un object), entonces el perro no huirá hasta que se desaparezcan las cinco correas. Los indicadores débiles, por otro lado, son como niños pequeños que señalan al perro y dicen "¡Mira, un perro!" Mientras el perro todavía esté con la correa, los niños pequeños todavía pueden ver al perro, y aún apuntarán hacia él. Sin embargo, tan pronto como se desprenden todas las correas, el perro huye sin importar cuántos niños pequeños lo apunten. Tan pronto como el último puntero fuerte (correa) ya no apunta a un object, el object será desasignado, y todos los pointers débiles serán eliminados. Cuando usamos débil? La única vez que querría usar débil es si desea evitar ciclos de retención (por ejemplo, el padre conserva el hijo y el hijo conserva el padre, por lo que nunca se libera).

  1. retain = strong -it se retiene, el valor anterior se libera y se asigna -retain especifica el nuevo valor que se debe enviar -retain en la asignación y el valor anterior enviado -release -retain es igual a strong. -apple dice que si escribe retener se convertirá automáticamente / funcionará como solo fuerte. -methods como "alloc" incluyen un implícito "retener"

Ejemplo:

 @property (nonatomic, retain) NSString *name; @synthesize name; 
  1. asignar -assign es el valor pnetworkingeterminado y simplemente realiza una asignación de variable -assign es un atributo de propiedad que le dice al comstackdor cómo sintetizar la implementación de setter de la propiedad -Yo usaría asignar para properties primitivas C y débil para references débiles a objects Objective-C.

Ejemplo:

 @property (nonatomic, assign) NSString *address; @synthesize address; 
  1. unsafe_unretained

    -unsafe_unretained es un calificador de propiedad que le dice a ARC cómo insert retener / liberar llamadas -unsafe_unretained es la versión ARC de assign.

Ejemplo:

 @property (nonatomic, unsafe_unretained) NSString *nickName; @synthesize nickName; 
  1. copy -copy se requiere cuando el object es mutable. -copy especifica el nuevo valor debe enviarse -copy en la asignación y el valor anterior enviado -release. -copy es como retener devuelve un object que debe liberar explícitamente (p. ej., en desocupado) en entornos no recolectados de basura. -si utiliza la copy, aún necesita liberarla en dealloc. -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.

Ejemplo:

 @property (nonatomic, copy) NSArray *myArray; @synthesize myArray; 

Se puede acceder a la propiedad atómica por un solo hilo a la vez. Es seguro para hilos . El valor pnetworkingeterminado es atómico. Tenga en count que no hay palabra key atómica.

Nonatomic significa que múltiples subprocesss pueden acceder al elemento. Es un subprocess inseguro.

Entonces, uno debe tener mucho cuidado al usar atómica. Como afecta el performance de su código