web-dev-qa-db-fra.com

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 nonatomique?

Merci

142
user100051

Jetez un coup d'œil au Apple Docs .

En gros, si vous dites nonatomic et que vous générez les accesseurs à l'aide de @synthesize, Si plusieurs threads tentent de modifier/lire la propriété à la fois, un problème peut survenir. Vous pouvez obtenir des valeurs partiellement écrites ou des objets libérés/conservés, ce qui peut facilement entraîner des pannes. (Ceci est potentiellement beaucoup plus rapide qu'un accesseur atomique, cependant.)

Si vous utilisez la valeur par défaut (atomic; il n’existait auparavant aucun mot clé, mais est maintenant ), les méthodes @synthesize D utilisent un objet -Level lock pour s'assurer que plusieurs lectures/écritures dans une même propriété sont sérialisées. Comme le font remarquer les docs Apple, , tout l’objet est thread-safe , mais l’individu propriété lit/écrit sont.

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

265
Jesse Rusak

Après avoir lu tant d'articles et de publications StackOverflow et après avoir créé des applications de démonstration pour vérifier les attributs de propriété Variable, j'ai décidé de rassembler toutes les informations sur les attributs.

  1. atomique // par défaut
  2. non atomique
  3. fort = conserver // par défaut
  4. faible = non sécurisé_unretained
  5. conserver
  6. assign // valeur par défaut
  7. unsafe_unretained
  8. copie
  9. lecture seulement
  10. readwrite // par défaut

donc ci-dessous est le lien de l'article détaillé où vous pouvez trouver ci-dessus mentionné tous les attributs, cela va certainement vous aider. Un grand merci à toutes les personnes qui donnent les meilleures réponses ici !!

Attributs de propriété de variable ou modificateurs sous iOS

  1. atomique
    • Atomic signifie qu'un seul thread accède à la variable (type statique).
    • Atomic est thread-safe.
    • Mais sa performance est lente.
    • Atomic est le comportement par défaut.
    • Les accesseurs atomiques dans un environnement non récupéré (c'est-à-dire lors de l'utilisation de rétention/release/autorelease) utiliseront un verrou pour s'assurer qu'un autre thread n'interfère pas avec le réglage/obtention correct de la valeur.
    • ce n'est pas réellement un mot clé.

Exemple :

@property (retain) NSString *name;

@synthesize name;
  1. nonatomique
    • Nonatomic signifie que plusieurs threads ont accès à la variable (type dynamique).
    • Nonatomic est un fil dangereux.
    • Mais c'est rapide en performance.
    • Nonatomic n'est PAS un comportement par défaut. nous devons ajouter un mot clé nonatomic dans l'attribut de propriété.
    • il peut en résulter un comportement inattendu lorsque deux processus (threads) différents accèdent à la même variable au même moment.

Exemple:

@property (nonatomic, retain) NSString *name;

@synthesize name;
46
swiftBoy

En plus de ce qui a déjà été dit sur la sécurité du thread, les propriétés non atomiques sont plus rapides que les accesseurs atomiques. Ce n’est pas quelque chose qui vous préoccupe habituellement, mais gardez cela à l’esprit. Les propriétés générées par Core Data sont partiellement non atomiques pour cette raison.

12

Dans un programme multi-thread, une opération atomique ne peut pas être interrompue partiellement, contrairement aux opérations non-atomiques.

Par conséquent, vous devriez utiliser des mutex (ou quelque chose comme ça) si vous avez une opération critique non atomique que vous ne voulez pas interrompre.

9
joshdick

Si vous spécifiez "atomique", les fonctions d'accès générées ont un code supplémentaire à protéger contre les mises à jour simultanées.

8
Paul Tomblin

Généralement, atomique signifie que les écritures/lectures sur la propriété se produisent en une seule opération. Atomic_operation

6
Jake

Vous pouvez obtenir une poignée de ces choses en lisant l'article ci-dessous.

Threading Explained avec le but de nonatomic

nonatomic - Pas de thread thread safe

atomic - Thread Safe - C'est l'attribut de la propriété par défaut.

2
Easwaramoorthy K

Le "atomique" signifie que l'accès à la propriété est thread-safe. Alors que le "nonatomique" en est le contraire. Lorsque vous déclarez une propriété dans Objective-C, propriété sont atomiques par défaut, de sorte 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 via le setter est toujours entièrement récupérée ou définie, quels que soient les autres threads exécutés simultanément. vous déclarez une propriété 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 nonatomic dépend de l'environnement. Par défaut, les accesseurs synthétisés sont atomiques. Donc, non atomique est considérablement plus rapide que l'atome.

0
AbcTest