Que signifie "non-atomique" dans ce code?
@property(nonatomic, retain) UITextField *theUsersName;
Quelle est la différence entre atomique et nonatomique?
Merci
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.
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.
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
Exemple :
@property (retain) NSString *name;
@synthesize name;
Exemple:
@property (nonatomic, retain) NSString *name;
@synthesize name;
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.
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.
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.
Généralement, atomique signifie que les écritures/lectures sur la propriété se produisent en une seule opération. Atomic_operation
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.
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.