Objective-C declaró atributos @property (no atómico, copia, fuerte, débil)


289

¿Puede alguien que me explique en detalle cuando debo utilizar cada atributo: nonatomic, copy, strong, weak, y así sucesivamente, por una propiedad declarada, y explicar lo que hace cada uno? Algún tipo de ejemplo también sería genial. Estoy usando ARC.



Respuestas:


559

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


No atómico

nonatomicse usa para propósitos de subprocesos múltiples. Si hemos establecido el atributo no atómico en el momento de la declaración, cualquier otro subproceso que desee acceder a ese objeto puede acceder a él y dar resultados con respecto al subprocesamiento múltiple.

Copiar

copyse 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 los cambios realizados por otros propietarios del objeto. Deberá liberar el objeto cuando haya terminado con él porque está reteniendo la copia.

Asignar

Assignes algo opuesto a copy. Al llamar al captador de una assignpropiedad, devuelve una referencia a los datos reales. Por lo general, usa este atributo cuando tiene una propiedad de tipo primitivo (float, int, BOOL ...)

Conservar

retaines obligatorio cuando el atributo es un puntero a un objeto. El setter generado por @synthesizeretendrá (también conocido como agregar un recuento de retención) el objeto. Deberá liberar el objeto cuando haya terminado con él. Al utilizar la retención, aumentará el recuento de retención y ocupará la memoria en el grupo de liberación automática.

Fuerte

stronges un reemplazo para el atributo retener, como parte del Conteo de referencia automatizado (ARC) de Objective-C. En el código no ARC es solo un sinónimo de retener.

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

Débiles

weakes similar a strongexcepto que no aumentará el recuento de referencias en 1. No se convierte en propietario de ese objeto, sino que solo tiene una referencia a él. Si el recuento de referencia del objeto cae a 0, aunque todavía pueda estar apuntando a él aquí, se desasignará de la memoria.

El enlace anterior contiene información buena sobre débil y fuerte.


1
si está utilizando este NSString solo internamente en esa clase, de lo que ni siquiera necesita una propiedad, puede convertirlo en un iVar y si lo está utilizando en otra clase de la que le aconsejaré (fuerte, copia).
Ankit Srivastava

1
Te falta la propiedad Asignar.
mskw

10
nonatomicsignifica que debería no puede acceder simultáneamente por varios hilos. El valor predeterminado es atomiclo que lo hace seguro para subprocesos.
wcochran

1
Es un poco inquietante que, después de todo este tiempo, la definición de no atómico siga siendo incorrecta y parezca atómica. Me pregunto cuántas personas han usado esto en los últimos cinco años y se han equivocado. Lo que dijo @wcochran fue correcto. no atómico significa que el acceso al puntero no se maneja atómicamente, por lo que no es seguro para subprocesos. El beneficio, según tengo entendido, de que no es atómico es que es más liviano.
John Bushnell

1
Además del comentario de @JohnBushnell, hay muchos otros errores e imprecisiones en esta respuesta. Tampoco ha envejecido bien, por lo que es algo histórico. Ve a otro lado si buscas una respuesta a esta pregunta.
CRD

45

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

strongse usa con ARC y básicamente te ayuda, al no tener que preocuparte por el conteo de retención de un objeto. ARC lo libera automáticamente cuando haya terminado con él. El uso de la palabra clave strongsignifica que usted es el propietario del objeto.

weakpropiedad significa que no lo posee y solo realiza un seguimiento del objeto hasta que el objeto al que se le asignó se queda, tan pronto como se suelta el segundo objeto pierde su valor. Por ej. obj.a=objectB;se usa y a tiene una propiedad débil, entonces su valor solo será válido hasta que objectB permanezca en la memoria.

copyla propiedad está muy bien explicada aquí

strong,weak,retain,copy,assignson mutuamente excluyentes, por lo que no puede usarlos en un solo objeto ... lea la sección "Propiedades declaradas"

esperando que esto te ayude un poco ...


por qué fuerte, débil, retener, copiar, asignar mutuamente excluyentes
vinoth.kumar

nonatomicsolo significa que no se aplica exclusión. No significa que el acceso no sea seguro para subprocesos. Ese es un detalle de implementación que atomicvs. nonatomicno captura.
bbum

@bbum ¿Puedes explicar la diferencia entre no exclusión y no es seguro para subprocesos ...?
Ankit Srivastava

1
La exclusión de @AnkitSrivastava es cuando el subproceso A bloquea el subproceso B para que no descienda por una ruta de código. Si esa ruta de código es segura para la ejecución desde múltiples subprocesos, entonces la exclusión no es necesaria. No es seguro para subprocesos, lo que significa que la ruta del código puede arrojar resultados indefinidos si A y B la bajan simultáneamente. Es decir, la exclusión se puede usar para hacer que algo sea seguro para subprocesos, pero la seguridad de subprocesos no requiere una ejecución exclusiva, no concurrente.
bbum

17

Este enlace tiene el desglose

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

asignar implica propiedad __unsafe_unretained.

copy implica una propiedad __strong, así como el comportamiento habitual de la semántica de copia en el setter

retener implica __fuerte propiedad.

fuerte implica una propiedad __fuerte.

inseguro_reretenido implica propiedad __unsafe_unretained.

débil implica __propiedad débil.


¿No se usa la propiedad Asignar solo para iVar y valores? Entonces, ¿por qué no es seguro y por qué es necesario tener en cuenta que no está retenido?
mskw

9

Grandes respuestas! Una cosa que me gustaría aclarar más es nonatomic/ atomic. El usuario debe comprender que esta propiedad: "atomicidad" se propaga solo en la referencia del atributo y no en su contenido. Es decir atomic, garantizará al usuario la atomicidad 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 dictserá leído / establecido de manera atómica por diferentes hilos. PERO el dictmismo (el diccionario dictapuntando a) sigue siendo inseguro , es decir, todas las operaciones de lectura / adición al diccionario siguen siendo inseguras.

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.