¿Qué significa la propiedad "Nonatomic"?


¿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

Author: swiftBoy, 2009-05-04

9 answers

Echa un vistazo a la Apple Docs.

Básicamente, si dices nonatomic, y generas los accesores usando @synthesize, entonces si varios hilos intentan cambiar/leer la propiedad a la vez, puede ocurrir maldad. Puede obtener valores parcialmente escritos u objetos sobre-liberados / retenidos, lo que puede conducir fácilmente a bloqueos. (Esto es potencialmente mucho más rápido que un accessor atómico, sin embargo.)

Si usa el valor predeterminado (que es atomic; no solía haber ninguna palabra clave para esto, pero hay es ahora), luego los métodos @synthesize d usan un bloqueo a nivel de objeto para asegurar que múltiples lecturas/escrituras en una sola propiedad sean serializadas. Como señalan los documentos de Apple, esto no significa que todo el objeto sea seguro para subprocesos, pero la propiedad individual lee/escribe lo es.

Por supuesto, si implementa sus propios accesores en lugar de usar @synthesize, creo que estas declaraciones no hacen nada, excepto expresar su intención en cuanto a si la propiedad se implementa en un threadsafe manera.

 262
Author: Jesse Rusak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-05 17:14:46

Después de leer tantos artículos y publicaciones de StackOverflow, y haber hecho aplicaciones de demostración para verificar atributos de propiedades variables, decidí reunir toda la información de atributos

  1. atomic / / default
  2. no atómico
  3. strong = retain / / default
  4. weak = unsafe_unretained
  5. conservar
  6. asignar / / predeterminado
  7. unsafe_unretained
  8. copia
  9. readonly
  10. readwrite // default

Así que a continuación se muestra el enlace detallado del artículo donde se pueden encontrar todos los atributos mencionados anteriormente, que sin duda le ayudará. Muchas gracias a todas las personas que dan las mejores respuestas aquí!!

Atributos o modificadores de propiedades variables en iOS

  1. atómica
    • Atómico significa que solo un hilo accede a la variable (tipo estático).
    • Atomic es seguro para hilos.
    • Pero es lento en rendimiento.
    • Atomic es el comportamiento predeterminado.
    • Los accesores atómicos en un entorno no recolectado de basura (es decir, cuando se usa retain/release/autorelease) usarán un bloqueo para asegurarse de que otro hilo 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;
  1. no atómico
    • Nonatomic significa acceso múltiple del hilo la variable (dinámica tipo).
    • Nonatomic es hilo inseguro.
    • Pero es rápido en rendimiento.
    • Nonatomic NO es un comportamiento predeterminado; necesitamos agregar la palabra clave nonatomic en el atributo property.
    • puede resultar en un comportamiento inesperado, cuando dos procesos diferentes (subprocesos) acceden a la misma variable al mismo tiempo.

Ejemplo:

@property (nonatomic, retain) NSString *name;

@synthesize name;
 45
Author: swiftBoy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-03 09:18:54

Además de lo que ya se ha dicho sobre threadsafeness, las propiedades no atómicas son más rápidas que los accesores atómicos. No es algo de lo que normalmente tengas que preocuparte, pero tenlo en cuenta. Las propiedades generadas por los datos centrales son parcialmente no atómicas por esta razón.

 12
Author: Marc Charbonneau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-04 21:39:44

En un programa multihilo, una operación atómica no puede interrumpirse 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 que no es atómica y que no desea que se interrumpa.

 9
Author: joshdick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-04 19:55:59

Si especifica "atómica", las funciones de acceso generadas tienen un código adicional para protegerse contra actualizaciones simultáneas.

 8
Author: Paul Tomblin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-04 19:54:32

Normalmente atómico significa que las escrituras/lecturas en la propiedad ocurren como una sola operación. Operación atómica

 6
Author: Jake,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-18 12:58:16

Usted puede poder conseguir una manija de estas materias leyendo el artículo abajo.

Threading Explicado con el propósito no atómico

No Atómico-No Seguro para hilos

Atomic - Thread Safe - Este es el atributo de propiedad predeterminado.

 2
Author: Easwaramoorthy K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-15 16:14:17

El "atomic" significa que el acceso a la propiedad es seguro para subprocesos. mientras que el "no atómico" es lo opuesto a él. Cuando se declara una propiedad en Objective-C, la propiedad es atómica por defecto, de modo que los accesores sintetizados proporcionan un acceso robusto a la propiedad en un entorno multiproceso, es decir, el valor devuelto por el getter o set a través del setter siempre se recupera o establece por completo, independientemente de qué otros subprocesos se estén ejecutando simultáneamente. Pero si declaras la propiedad como no atómico como abajo

@property (nonatomic, retain)  NSString *myString;

Entonces significa que un accessor sintetizado para una propiedad de objeto simplemente devuelve el valor directamente. El efecto del atributo no atómico depende del entorno. Por defecto, los accesores sintetizados son atómicos. Así que lo no atómico es considerablemente más rápido que lo atómico.

 0
Author: AbcTest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-21 11:00:33

Uno es para subprocesos múltiples. Uno isnt

 -2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-04 12:41:03