ios - mundo - objective c tutorial
¿Qué significa la propiedad "Nonatomic"? (9)
¿Qué significa "no atómico" en este código?
@property(nonatomic, retain) UITextField *theUsersName;
¿Cuál es la diferencia entre atómico y no atómico?
Gracias
Además de lo que ya se ha dicho sobre la seguridad de las hebras, las propiedades no atómicas son más rápidas que las de acceso atómico. No es algo por lo que deba preocuparse, pero téngalo en cuenta. Las propiedades generadas de Core Data son parcialmente no atómicas por este motivo.
Después de leer tantos artículos y publicaciones de , y de haber hecho aplicaciones de demostración para verificar los atributos de propiedades de las Variables, decidí juntar toda la información de los atributos
- atómico // predeterminado
- no atómico
- fuerte = retener // predeterminado
- weak = unsafe_unretained
- conservar
- asignar // por defecto
- inseguro_unretenido
- dupdo
- solo lectura
- readwrite // predeterminado
así que debajo está el enlace detallado del artículo donde puedes encontrar todos los atributos mencionados anteriormente, que definitivamente te ayudarán. ¡Muchas gracias a todas las personas que dan mejores respuestas aquí!
- atómico
- Atómico significa que solo un hilo accede a la variable (tipo estático).
- Atomic es seguro para subprocesos.
- Pero es lento en rendimiento.
- Atomic es el comportamiento predeterminado.
- Los accesadores atómicos en un entorno no recogido de basura (es decir, cuando se utiliza retener / liberar / autorrelease) utilizarán un bloqueo para garantizar que otro subproceso no interfiera con la configuración / obtención correcta del valor.
- en realidad no es una palabra clave.
Ejemplo:
@property (retain) NSString *name;
@synthesize name;
- no atómico
- Nonatomic significa acceso múltiple a la variable (tipo dinámico).
- Nonatomic es inseguro.
- Pero es rápido en rendimiento.
- Nonatomic NO es un comportamiento predeterminado; necesitamos agregar una palabra clave no atómica en el atributo de propiedad.
- puede provocar un comportamiento inesperado, cuando dos procesos (hilos) diferentes acceden a la misma variable al mismo tiempo.
Ejemplo:
@property (nonatomic, retain) NSString *name;
@synthesize name;
Echa un vistazo a los Apple Docs .
Básicamente, si dices no nonatomic
, y @synthesize
usando @synthesize
, entonces si varios hilos intentan cambiar / leer la propiedad a la vez, la maldad puede suceder. Puede obtener valores escritos parcialmente o objetos sobre liberados / retenidos, lo que puede provocar bloqueos. (Esto es potencialmente mucho más rápido que un accesorio atómico, sin embargo).
Si usa el valor predeterminado (que es atomic
; no solía haber una palabra clave para esto, pero ahora lo está ), los métodos @synthesize
d usan un bloqueo de nivel de objeto para garantizar que varias lecturas / escrituras en una sola propiedad se serialicen . Como señalan los documentos de Apple, esto no significa que todo el objeto es seguro para subprocesos , pero sí las lecturas / escrituras de propiedades individuales.
Por supuesto, si implementa sus propios @synthesize
acceso en lugar de utilizar @synthesize
, creo que estas declaraciones no hacen más que expresar su intención de si la propiedad se implementa de manera segura.
El "atómico" significa que el acceso a la propiedad es seguro para subprocesos, mientras que el "no atómico" es el opuesto al mismo. Cuando declaras una propiedad en Objective-C, la propiedad es atómica por defecto para que los accesadores sintetizados proporcionen un acceso sólido a la propiedad en un entorno multiproceso, es decir, el valor devuelto por el eliminador o el conjunto a través del colocador siempre se recupera o establece completamente, independientemente de qué otros hilos se ejecuten simultáneamente. Pero si declara la propiedad como no atómica, como a continuación
@property (nonatomic, retain) NSString *myString;
entonces significa que un acceso sintetizado para una propiedad de objeto simplemente devuelve el valor directamente. El efecto del atributo no atómico depende del entorno. Por defecto, los accesadores sintetizados son atómicos. Entonces, no atómico es considerablemente más rápido que atómico.
En un programa de subprocesos múltiples, una operación atómica no se puede interrumpir parcialmente, mientras que las operaciones no atómicas sí pueden.
Por lo tanto, debe usar mutexes (o algo así) si tiene una operación crítica no atómica que no desea que se interrumpa.
Por lo general, atómico significa que escribe / lee en la propiedad como una operación única. Atomic_operation
Puede obtener un control de este material leyendo el artículo a continuación.
Enhebrado Explicado con el propósito no atómico
no atómico - No es seguro para subprocesos
atomic - Thread Safe - Este es el atributo de propiedad predeterminado.
Si especifica "atómico", las funciones de acceso generadas tienen un código adicional para evitar actualizaciones simultáneas.
Uno es para multi hilos. Uno no es