106 votes

Que signifie la propriété "Nonatomic" ?

Que signifie "non atomique" dans ce code ?

@property(nonatomic, retain) UITextField *theUsersName;

Quelle est la différence entre atomique et non atomique ?

Merci

5voto

Jake Points 1900

En général, le terme atomique signifie que les écritures/lectures de la propriété se font en une seule opération. Opération atomique

2voto

Easwaramoorthy K Points 886

Vous pouvez vous familiariser avec ces produits en lisant l'article ci-dessous.

Le threading expliqué avec le but de nonatomic

nonatomic - Non thread safe

atomic - Thread Safe - Il s'agit de l'attribut de propriété par défaut.

0voto

AbcTest Points 34

Le site "atomique" signifie que l'accès à la propriété est sécurisé par les threads, tandis que l'option "non atomique" est son contraire. Lorsque vous déclarez une propriété en Objective-C, celle-ci est atomique par défaut afin que les accesseurs synthétisés fournissent un accès robuste à la propriété dans un environnement multithread - c'est-à-dire que la valeur renvoyée par le getter ou définie par le setter est toujours entièrement récupérée ou définie, quels que soient les autres threads exécutés simultanément. Mais si vous déclarez une propriété comme non atomique, comme ci-dessous

@property (nonatomic, retain)  NSString *myString;

alors cela signifie qu'un accesseur synthétisé pour une propriété d'objet renvoie simplement la valeur directement. L'effet de l'attribut non atomique dépend de l'environnement. Par défaut, les accesseurs synthétisés sont atomiques. Ainsi, nonatomic est considérablement plus rapide que atomic.

-1voto

L'un d'eux est destiné aux fils multiples. L'autre ne l'est pas.

-3voto

Joe Points 59

YUP... Moi aussi, j'étais sOoOOo confus par ceci... Le sens du mot 'atomique' tel qu'il est utilisé dans les propriétés de l'Objective-C est directement opposé aux conventions de programmation multithread dans tous les systèmes que j'ai connus.

Par convention de programmation, une OPÉRATION "atomique" sur le processeur (vous savez, ces choses comme les push et pops de registre etc...) est une opération unique.

Il est donc "atomique" par nature et il n'est donc pas nécessaire de verrouiller les opérations entre les accès de plusieurs threads...

Même si l'on peut avoir plusieurs CPU, il n'y a toujours qu'une seule adresse mémoire où se trouve cette iVar... et un seul CPU peut écrire cette adresse mémoire en un instant plus petit que moi...

Si une opération est exécutée sur un processeur 32 bits... la largeur de l'opération est de 32 bits, soit 4 octets, ce qui correspond à la taille des registres push/pops, etc...

Par conséquent, lorsqu'une iVar est déclarée en tant qu'INT32 (ce qui représente 4 octets) et que le CPU peut pousser/ouvrir 32 bits (soit 4 octets, soit la taille de l'INT32), rien ne peut s'interposer et interrompre l'opération unique de poussée/ouverture du registre...

(La façon dont on "utilise" cette iVar dans le code entre les threads est un autre sujet de préoccupation - c'est-à-dire des opérations uniques comme ++i ou i++, etc...).

Mais le mot "atomique" signifie traditionnellement (c'est-à-dire depuis l'invention du processeur) qu'il s'agit d'une opération qui ne peut pas être interrompue...

On le nomme ainsi parce qu'il n'y a rien de "plus petit qu'un atome"...

(enfin... :P)

Citation d'une documentation Apple : "Si vous spécifiez nonatomique, un accesseur synthétisé pour une propriété d'objet renvoie simplement la valeur directement". (c'est-à-dire sans verrou)

Ainsi, pour les projets Objective-C, vous pouvez...

définir ATOMIC nonatomic

définir l'atome NONATOMIQUE

// (je plaisante à propos des définitions j'adore l'Objective-C et le C++ et le C)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X