Objective-C declaró @atributos de propiedad (nonatomic, copy, strong, weak)


¿Puede alguien explicarme en detalle cuándo debo usar cada atributo: nonatomic, copy, strong, weak, y así sucesivamente, para una propiedad declarada, y explicar lo que cada uno hace? Algún tipo de ejemplo también sería genial. Estoy usando ARC.

Author: Josh Caswell, 2012-03-25

4 answers

Esta respuesta tiene numerosos errores y también está desactualizada. Por favor, consulte otras preguntas/respuestas y los comentarios.


Nonatomic

nonatomic se utiliza para propósitos de roscado múltiple. Si hemos establecido el atributo nonatomic en el momento de la declaración, entonces cualquier otro hilo que desee acceder a ese objeto puede acceder a él y dar resultados con respecto a multi-threading.

Copiar

copy se requiere cuando el objeto es mutable. Use esto si necesita el valor del objeto tal como está en este momento, y no desea que ese valor refleje ningún cambio realizado por otros propietarios del objeto. Tendrá que liberar el objeto cuando haya terminado con él porque está reteniendo la copia.

Asignar

Assign es algo opuesto a copy. Cuando se llama al getter de una propiedad assign, devuelve una referencia a los datos reales. Normalmente se utiliza este atributo cuando se tiene un propiedad de tipo primitivo (float, int, BOOL...)

Conservar

retain se requiere cuando el atributo es un puntero a un objeto. El setter generado por @synthesize retendrá (también conocido como agregar un retain count a) el objeto. Tendrá que liberar el objeto cuando haya terminado con él. Al usar retain it aumentará el recuento de retain y ocupará memoria en el grupo de autorelease.

Strong

strong es un reemplazo para el atributo retain, como parte de Objective-C Automated Reference Counting (ARC). En código no ARC es solo un sinónimo de retain.

Este es un buen sitio web para aprender sobre strong y weak para iOS 5. http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

Débil

weak es similar a strong excepto que no aumentará el recuento de referencias en 1. No se convierte en un propietario de ese objeto, sino que solo tiene una referencia a él. Si el recuento de referencia del objeto cae a 0, a pesar de que todavía puede estar apuntando a él aquí, se desasignará de la memoria.

El enlace anterior contiene buena información sobre Débil y Fuerte.

 551
Author: iDhaval,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-01 22:40:34

nonatomic la propiedad indica que el objeto no es seguro para subprocesos, lo que significa que si un subproceso diferente intenta acceder a este objeto, pueden suceder cosas malas, pero esto es mucho más rápido que la propiedad atómica.

strong se utiliza con ARC y básicamente le ayuda, al no tener que preocuparse por el recuento de retención de un objeto. ARC lo libera automáticamente cuando haya terminado con él.Usar la palabra clave strong significa que usted es el dueño del objeto.

weak propiedad significa que usted no es dueño de ella y simplemente realiza un seguimiento del objeto hasta que el objeto al que fue asignado permanece , tan pronto como el segundo objeto se libera pierde su valor. Por ejemplo. obj.a=objectB; se usa y a tiene una propiedad débil , que su valor solo será válido hasta que ObjectB permanezca en memoria.

copy la propiedad está muy bien explicado aquí

strong,weak,retain,copy,assign son mutuamente excluyentes por lo que no se pueden utilizar en un solo objeto... lea la sección "Propiedades declaradas "

Esperando que esto te ayude trozo...

 45
Author: Ankit Srivastava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:28

Este enlace tiene el desglose

Http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property

Asignar implica propiedad __insegura_no retenida.

La copia implica _ _ una fuerte propiedad, así como el comportamiento habitual de la copia semántica en el setter.

Retener implica __fuerte propiedad.

Fuerte implica __fuerte propiedad.

Unsafe_unretained implica __inseguro_bien propiedad.

Débil implica __propiedad débil.

 17
Author: Mick MacCallum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-25 11:31:15

¡Grandes respuestas! Una cosa que me gustaría aclarar más profundamente es nonatomic/atomic. El usuario debe entender que esta propiedad - "atomicity" se extiende solo sobre la referencia del atributo y no sobre su contenido. Es decir, atomic garantizará la atomicidad del usuario para leer/configurar el puntero y solo el puntero al atributo. Por ejemplo:

@interface MyClass: NSObject
@property (atomic, strong) NSDictionary *dict;
...

En este caso se garantiza que el puntero al dict será leído/establecido de manera atómica por diferentes hilos. PERO el dict en sí mismo (el diccionario dict apuntando a) sigue siendo thread unsafe, es decir, todas las operaciones de lectura/adición al diccionario siguen siendo thread unsafe.

Si necesita una colección segura de subprocesos, tiene una mala arquitectura (más a menudo) O un requisito real (más raro). Si es un "requisito real", debe encontrar un componente de recolección seguro de hilo bueno y probado O estar preparado para pruebas y tribulaciones escribiendo su propio componente. Este último caso mira a los paradigmas" sin bloqueo"," sin espera". Parece ciencia de cohetes a primera vista, pero podría ayudarlo a lograr un rendimiento fantástico en comparación con el"bloqueo habitual".

 9
Author: DaddyM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-15 13:12:21