objective-c automatic-ref-counting declared-property

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.