objective c - Objective-C declaró atributos de propiedad(no atómicos, copia, fuerte, débil)
automatic-ref-counting declared-property (4)
¿Puede alguien explicarme en detalle cuándo debo usar cada atributo: no nonatomic
, copy
, strong
, weak
, etc., para una propiedad declarada y explicar qué hace cada uno? Algún tipo de ejemplo sería genial también. Estoy usando ARC.
¡Grandes respuestas! Una cosa que me gustaría aclarar más profundamente es nonatomic
atomic
/ atomic
. El usuario debe entender que esta propiedad - "atomicidad" se propaga solo en la referencia del atributo y no en 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
se leerá / configurará de forma atómica mediante diferentes subprocesos. PERO el dict
sí (el diccionario que señala al apuntar) todavía no es seguro para el subproceso , es decir, todas las operaciones de lectura / adición al diccionario siguen siendo inseguras para el subproceso.
Si necesita una recopilación segura para subprocesos, tiene una arquitectura defectuosa (más a menudo) O un requisito real (más raro). Si se trata de un "requisito real", debe encontrar un componente de recopilación seguro para subprocesos que sea bueno y probado O ESTAR preparado para las pruebas y tribulaciones que escriban la suya. Este último caso mira los paradigmas "sin bloqueo", "sin espera". A primera vista, se parece a la ciencia espacial, pero podría ayudarlo a lograr un rendimiento fantástico en comparación con el "bloqueo habitual".
Este enlace tiene el desglose
http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property
asignar implica __unsafe_unretained propiedad.
copiar implica la propiedad de __strong, así como el comportamiento habitual de la semántica de copia en el configurador.
retener implica propiedad __strong.
fuerte implica __strong propiedad.
unsafe_unretained implica propiedad __unsafe_unretained.
débil implica __ propiedad débil.
nonatomic
propiedad no nonatomic
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 usa con ARC y, básicamente, le ayuda a usted, al no tener que preocuparse por el recuento de un objeto. ARC lo libera automáticamente para usted cuando haya terminado con él. El uso de la palabra clave strong
significa que usted posee el objeto.
propiedad weak
significa que no lo posee y simplemente realiza un seguimiento del objeto hasta que el objeto al que fue asignado permanece, tan pronto como se libera el segundo objeto, pierde su valor. Por ejemplo. obj.a=objectB;
se utiliza y tiene una propiedad débil, que su valor solo será válido hasta que objectB permanezca en la memoria.
propiedad de copy
está muy bien explicada aquí
strong,weak,retain,copy,assign
se excluyen mutuamente, por lo que no puede usarlos en un solo objeto ... lea la sección "Propiedades declaradas"
Esperando que esto te ayude un poco ...
Esta respuesta tiene numerosos errores y también está desactualizada. Por favor vea otras preguntas / respuestas y los comentarios.
No atómico
nonatomic
se utiliza para propósitos de subprocesos múltiples. Si hemos establecido el atributo no atómico en el momento de la declaración, entonces cualquier otro subproceso que desee acceder a ese objeto puede acceder a él y dar resultados con respecto al subprocesamiento múltiple.
Dupdo
se requiere copy
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
Assign
es algo opuesto a copy
. Cuando se llama al captador de una propiedad de assign
, devuelve una referencia a los datos reales. Normalmente, utiliza este atributo cuando tiene una propiedad de tipo primitivo (float, int, BOOL ...)
Conservar
se requiere la retain
cuando el atributo es un puntero a un objeto. El setter generado por @synthesize
retendrá (también agregará un recuento de @synthesize
) al objeto. Deberá liberar el objeto cuando haya terminado con él. Al utilizar retener aumentará el recuento de retenciones y ocupará la memoria en el grupo de autorelease.
Fuerte
strong
es un reemplazo para el atributo de retención, como parte del Recuento Automático de Referencia (ARC) de Objective-C. En código no ARC es solo un sinónimo de retener.
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ébiles
weak
es similar a strong
excepto que no aumentará el recuento de referencias en 1. No se convierte en propietario de ese objeto, sino que contiene una referencia a él. Si el recuento de referencia del objeto se reduce a 0, aunque todavía lo esté apuntando aquí, se lo desasignará de la memoria.
El enlace anterior contiene información buena sobre Débil y Fuerte.