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

207voto

Jesse Rusak Points 33702

Jetez un coup d'œil à la Apple Docs .

En gros, si vous dites nonatomic et vous générez les accesseurs en utilisant @synthesize si plusieurs fils de discussion essaient de modifier/lire la propriété en même temps, des problèmes peuvent survenir. Vous pouvez obtenir des valeurs partiellement écrites ou des objets trop libérés/rétenus, ce qui peut facilement conduire à des plantages. (C'est potentiellement beaucoup plus rapide qu'un accesseur atomique, cependant).

Si vous utilisez la valeur par défaut (qui est atomic Avant, il n'y avait pas de mot-clé pour ça, mais maintenant est maintenant ), alors le @synthesize d utilisent un verrou au niveau de l'objet pour garantir que les lectures/écritures multiples d'une propriété sont sérialisées. Comme le souligne la documentation d'Apple, cela ne veut pas dire que l'objet entier est thread-safe. mais les propriétés lues/écrites le sont.

Bien sûr, si vous mettez en œuvre vos propres accesseurs plutôt que d'utiliser @synthesize Je pense que ces déclarations ne font rien d'autre qu'exprimer votre intention de savoir si la propriété est implémentée de manière threadsafe.

20voto

RDC Points 9222

Après avoir lu un grand nombre d'articles, de messages sur les SO et réalisé des applications de démonstration pour vérifier les attributs des propriétés variables, j'ai décidé de rassembler toutes les informations sur les attributs.

  1. atomique //par défaut
  2. non-atomique
  3. strong=retain //default
  4. weak= unsafe_unretained
  5. retenir
  6. attribuer //par défaut
  7. non sécurisé_non retenu
  8. copie
  9. en lecture seule
  10. lecture/écriture //par défaut

Vous trouverez ci-dessous le lien de l'article détaillé où vous pourrez trouver tous les attributs mentionnés ci-dessus, qui vous aideront certainement. Merci à toutes les personnes qui ont donné les meilleures réponses ici !

Attributs de propriétés variables ou Modificateurs dans iOS

  1. atomique
    • Atomique signifie qu'un seul thread accède à la variable (type statique).
    • Atomic est thread safe.
    • mais il est lent en performance
    • atomique est le comportement par défaut
    • Les accesseurs atomiques dans un environnement sans ramassage des ordures (c'est-à-dire en utilisant retain/release/autorelease) utiliseront un verrou pour pour s'assurer qu'un autre thread n'interfère pas avec la définition ou l'obtention correcte de la valeur.
    • il ne s'agit pas d'un mot-clé.

Exemple :

@property (retain) NSString *name;

@synthesize name;
  1. non-atomique
    • Nonatomique signifie que plusieurs fils accèdent à la variable (type dynamique).
    • Nonatomic n'est pas sûr pour les fils.
    • mais il est rapide en performance
    • Nonatomic n'est PAS le comportement par défaut, nous devons ajouter le mot clé nonatomic dans l'attribut de propriété.
    • il peut en résulter un comportement inattendu, lorsque deux processus différents (threads) accèdent à la même variable en même temps.

Exemple :

@property (nonatomic, retain) NSString *name;

@synthesize name;

12voto

Marc Charbonneau Points 30464

En plus de ce qui a déjà été dit à propos du threadsafeness, les propriétés non-atomiques sont plus rapides que les accesseurs atomiques. Ce n'est pas quelque chose dont vous devez habituellement vous soucier, mais gardez-le à l'esprit. Les propriétés générées par Core Data sont non atomiques en partie pour cette raison.

8voto

joshdick Points 585

Dans un programme multithread, une opération atomique ne peut pas être interrompue partiellement, alors que les opérations non atomiques le peuvent.

Par conséquent, vous devriez utiliser les mutex (ou quelque chose de ce genre) si vous avez une opération critique non atomique que vous ne voulez pas voir interrompue.

6voto

Paul Tomblin Points 83687

Si vous spécifiez "atomique", les fonctions d'accès générées contiennent du code supplémentaire pour éviter les mises à jour simultanées.

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