¿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.
objective-c
automatic-ref-counting
declared-property
Gaurav_soni
fuente
fuente
Respuestas:
Esta respuesta tiene numerosos errores y también está desactualizada. Por favor vea otras preguntas / respuestas y los comentarios.
No atómico
nonatomic
se 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
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 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 acopy
. Al llamar al captador de unaassign
propiedad, devuelve una referencia a los datos reales. Por lo general, usa este atributo cuando tiene una propiedad de tipo primitivo (float, int, BOOL ...)Conservar
retain
es obligatorio cuando el atributo es un puntero a un objeto. El setter generado por@synthesize
retendrá (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
strong
es 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
strong
yweak
para iOS 5. http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1Débiles
weak
es similar astrong
excepto 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.
fuente
nonatomic
significa que debería no puede acceder simultáneamente por varios hilos. El valor predeterminado esatomic
lo que lo hace seguro para subprocesos.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.strong
se 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 clavestrong
significa que usted es el propietario del objeto.weak
propiedad 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.copy
la propiedad está muy bien explicada aquístrong,weak,retain,copy,assign
son 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 ...
fuente
nonatomic
solo significa que no se aplica exclusión. No significa que el acceso no sea seguro para subprocesos. Ese es un detalle de implementación queatomic
vs.nonatomic
no captura.Este enlace tiene el desglose
http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property
fuente
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 deciratomic
, garantizará al usuario la atomicidad para leer / configurar el puntero y solo el puntero al atributo. Por ejemplo:En este caso, se garantiza que el puntero al
dict
será leído / establecido de manera atómica por diferentes hilos. PERO eldict
mismo (el diccionariodict
apuntando 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".
fuente