Que signifie «non atomique» dans ce code?
@property(nonatomic, retain) UITextField *theUsersName;
Quelle est la différence entre atomique et non atomique?
Merci
Que signifie «non atomique» dans ce code?
@property(nonatomic, retain) UITextField *theUsersName;
Quelle est la différence entre atomique et non atomique?
Merci
Réponses:
Jetez un œil aux documents Apple .
Fondamentalement, si vous dites nonatomic
et que vous générez les accesseurs en utilisant @synthesize
, alors si plusieurs threads essaient de modifier / lire la propriété à la fois, une mauvaise chose peut se produire. Vous pouvez obtenir des valeurs partiellement écrites ou des objets surdimensionnés / conservés, ce qui peut facilement entraîner des plantages. (Ceci est potentiellement beaucoup plus rapide qu'un accesseur atomique, cependant.)
Si vous utilisez la valeur par défaut (qui est atomic
; il n'y avait pas de mot-clé pour cela, mais il y en a maintenant ), les @synthesize
méthodes d utilisent un verrou au niveau de l'objet pour garantir que plusieurs lectures / écritures sur une seule propriété sont sérialisées. Comme le soulignent les documents Apple, cela ne signifie pas que l'objet entier est thread-safe , mais les lectures / écritures de propriétés individuelles le 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 d'autre que d'exprimer votre intention de savoir si la propriété est implémentée de manière threadsafe.
atomic
évite les plantages lors de l'accès aux propriétés individuelles mais ne garantit pas que l'objet dans son ensemble (c'est-à-dire accéder à des propriétés séparées comme le prénom et le nom) va faire la bonne chose.
Après avoir lu autant 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.
Voici donc le lien détaillé de l'article où vous pouvez trouver tous les attributs mentionnés ci-dessus, qui vous aideront certainement. Un grand merci à toutes les personnes qui donnent les meilleures réponses ici !!
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é des threads, les propriétés non atomiques sont plus rapides que les accesseurs atomiques. Ce n'est pas quelque chose dont vous devez généralement vous inquiéter, mais gardez-le à l'esprit. Les propriétés générées par Core Data sont partiellement non atomiques pour cette raison.
Dans un programme multithread, 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 "atomic", les fonctions d'accès générées ont du code supplémentaire pour se prémunir contre les mises à jour simultanées.
Généralement atomique signifie que les écritures / lectures dans la propriété se produisent en une seule opération. Opération_atomique
Vous pouvez avoir une idée de ce genre de choses en lisant l'article ci-dessous.
Threading expliqué avec le but du non atomique
nonatomique - Non compatible avec les threads
atomic - Thread Safe - Il s'agit de l'attribut de propriété par défaut.
Le "atomique" signifie que l'accès à la propriété est thread-safe. Tandis que le "nonatomic" est l'opposé. Lorsque vous déclarez une propriété en Objective-C, la propriété est atomique 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 indépendamment de ce que les autres threads s'exécutent simultanément. Mais si vous déclarez la 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. Donc non atomique est considérablement plus rapide que atomique.
L'un est pour les threads multiples. On n'est pas