Cours accéléré Atomic vs. Non Atomic Properties

Les propriétés de l’objectif C pourraient être définies comme atomiques ou non atomiques.

Quelle est la différence entre les deux et comment se comportent les propriétés Swift? Atomique ou non atomique?

Propriétés atomiques

Définir une propriété comme atomique garantira qu'une valeur valide sera renvoyée. Notez que valide ne signifie pas toujours correct (plus à ce sujet dans la prochaine section de ce post).

Cela ne signifie pas non plus que les propriétés atomiques sont thread-safe. Différents threads peuvent essayer d'écrire et de lire en même temps. Une des deux valeurs sera renvoyée - la valeur avant le changement ou la valeur du changement

Les propriétés atomiques souffrent d'un impact mineur sur les performances en raison du verrouillage et du déverrouillage avant et après la définition / l'obtention d'une valeur.

Atomic est le comportement par défaut des propriétés. C’est ce que vous obtenez si vous ne spécifiez rien.

Propriétés atomiques et exemple de threads

Disons que nous avons une propriété atomique:

point = CGPoint (x: 10, y: 10)

Dans notre application, nous avons trois threads qui tentent simultanément d'accéder à notre propriété de point.

  • Le thread A essaie de lire la propriété CGPoint
  • Le fil B est le point de réglage = CGPoint (x: 1, y: 1)
  • Le filetage C est le point de réglage = CGPoint (x: 5, y: 5)

La grande question est la suivante: que va-t-on retourner au fil A?

L'une des trois valeurs suivantes:

(x = 10, y = 10)
(x = 1, y = 1)
(x = 5, y = 5)

Une autre question que nous pouvons poser est la suivante: quelle sera la valeur finale de la propriété de point?

L'une des deux valeurs suivantes:

(x = 1, y = 1)
(x = 5, y = 5)

Propriétés non atomiques

Les propriétés non atomiques n'ont aucune garantie concernant la valeur renvoyée. Il peut s'agir de la valeur correcte, d'une valeur partiellement écrite ou même de certaines valeurs parasites.
Comme la plupart des choses qui ne sont pas sûres - cela vient avec une vitesse accrue d’accès à ces propriétés.

Propriétés non atomiques et exemple de threads

Prenons la même propriété de point et les trois mêmes threads qui font exactement la même chose que dans l'exemple de threads de propriétés atomiques.

Qu'est-ce qui sera retourné au fil A?

Inconnu! Il peut s'agir de l'une des trois valeurs différentes de l'exemple précédent. Ce pourrait même être (x = 5, y = 1) deux threads tentent de définir la valeur en même temps. La valeur a été partiellement écrite et nous récupérons une valeur partiellement écrite.

Comment cela fonctionne-t-il avec le runtime Objective-C?

Examinons la méthode «set value» pour le temps d’exécution d’Objective-C.

Notez que les propriétés non atomiques définissent directement la valeur de la propriété alors que la propriété atomic utilise des verrous pour protéger l'opération set.

Qu'en est-il de Swift?

Les propriétés de Swift sont non atomiques par défaut.
Mais, selon Apple utilisant Swift avec Cocoa et Objective-C (Swift 3.1):

Les attributs de propriété d'atomicité (atomiques et non atomiques) ne sont pas reflétés dans la déclaration de propriété Swift correspondante, mais les garanties d'atomicité de l'implémentation Objective-C sont toujours valables lors de l'accès à la propriété importée depuis Swift.

Donc, si vous définissez une propriété atomique dans Objective-C, elle restera atomique si elle est utilisée par Swift.